Це легше зрозуміти, якщо ви розділите код на дві частини.
Перша частина $("#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>")
З повагою!