Это легче понять, если вы разделите код на две части.
Первая часть $("#reviews").append("<%= ... %>");
- это javascript с erb. Это означает, что <%= ... %>
будет заменен тем, что возвращает код Ruby внутри него. Результатом этой замены должен быть действительный javascript, иначе он выдает ошибку, когда клиент пытается ее обработать. Итак, это первое, что вам нужно: вам нужен действительный javascript.
Еще одна вещь, которую следует учитывать, состоит в том, что любой робинец должен содержаться внутри строки javascript с двойными кавычками - обратите внимание на двойные кавычки вокруг <%= ... %>
. Это означает, что сгенерированный Javascript будет выглядеть следующим образом:
$("#reviews").append("...");
Теперь давайте рассмотрим рубин часть внутри <%= ... %>
. Что делает render(:partial => @review)
? Это рендеринг частичного, что означает, что это может быть рендеринг любого вида кода - html, css ... или даже больше javascript!
Итак, что произойдет, если наша часть содержит простой html, как этот?
<a href="/mycontroller/myaction">Action!</a>
Помните, что ваш javascript принимал строку с двумя кавычками в качестве параметра? Если мы просто заменим <%= ... %>
кодом этого частичного, то у нас есть проблема - сразу после href=
есть двойная цитата!Javascript будет недействителен:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
Для того, чтобы этого не случилось, вы хотите побеге эти специальные символы так что ваша строка не вырезано - вам нужно что-то, что создает это вместо:
<a href=\"/mycontroller/myaction\">Action!</a>
Это то, что escape_javascript
. Он гарантирует, что возвращенная строка не «сломает» javascript. Если вы его используете, вы получите желаемый результат:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
С уважением!
FYI, принятый ответ здесь не правильный ответ. Kikito's is – Steve