Es más fácil de entender si divide el código en dos partes.
La primera parte $("#reviews").append("<%= ... %>");
es javascript con erb. Esto significa que <%= ... %>
será reemplazado por lo que devuelva el código ruby que contiene. El resultado de ese reemplazo debe ser javascript válido, de lo contrario arrojará un error cuando el cliente intente procesarlo. Así que eso es lo primero: necesitas JavaScript válido .
Otra cosa a tener en cuenta es que lo que sea que ruby genere debe estar contenido dentro de una cadena de JavaScript con comillas dobles: observe las comillas dobles alrededor del <%= ... %>
. Esto significa que el JavaScript generado se verá así:
$("#reviews").append("...");
Ahora examinemos la parte rubí dentro del <%= ... %>
. ¿Qué render(:partial => @review)
hacer? Está renderizando un parcial, lo que significa que podría representar cualquier tipo de código: html, css ... ¡o incluso más javascript!
Entonces, ¿qué sucede si nuestro parcial contiene algún html simple, como este?
<a href="/mycontroller/myaction">Action!</a>
¿Recuerdas que tu javascript estaba tomando una cadena entre comillas dobles como parámetro? Si simplemente reemplazamos el <%= ... %>
con el código de ese parcial, entonces tenemos un problema, ¡inmediatamente después de que href=
hay una comilla doble! El javascript no será válido:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
Para que esto no suceda, desea escapar de estos caracteres especiales para que su cadena no se corte; necesita algo que genere esto en su lugar:
<a href=\"/mycontroller/myaction\">Action!</a>
Esto lo que escape_javascript
hace. Se asegura de que la cadena devuelta no "rompa" JavaScript. Si lo usa, obtendrá el resultado deseado:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
¡Saludos!