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