Это легче понять, если разделить код на две части.
Первая часть $("#reviews").append("<%= ... %>");
- это JavaScript с erb. Это означает, что <%= ... %>
будет заменено тем, что возвращает код ruby внутри него. Результатом этой замены должен быть действительный javascript, иначе он выдаст ошибку, когда клиент попытается его обработать. Итак, это первое: вам нужен действительный javascript .
Еще одна вещь, которую следует принять во внимание, это то, что генерируемый ruby должен содержаться внутри строки 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>")
Привет!