C'est plus facile à comprendre si vous divisez le code en deux parties.
La première partie $("#reviews").append("<%= ... %>");
est javascript avec erb. Cela signifie que le <%= ... %>
sera remplacé par tout ce que le code ruby à l'intérieur de celui-ci renvoie. Le résultat de ce remplacement doit être un javascript valide, sinon il générera une erreur lorsque le client essaiera de le traiter. C'est donc la première chose: vous avez besoin d' un javascript valide .
Une autre chose à prendre en compte est que tout ce que ruby génère doit être contenu dans une chaîne javascript avec des guillemets - notez les guillemets autour du <%= ... %>
. Cela signifie que le javascript généré ressemblera à ceci:
$("#reviews").append("...");
Examinons maintenant la partie rubis à l'intérieur du fichier <%= ... %>
. Que fait render(:partial => @review)
-on? C'est un rendu partiel - ce qui signifie qu'il pourrait être rendu n'importe quel type de code - html, css ... ou même plus javascript!
Alors, que se passe-t-il si notre partiel contient du html simple, comme celui-ci?
<a href="/mycontroller/myaction">Action!</a>
Rappelez-vous que votre javascript prenait une chaîne entre guillemets comme paramètre? Si nous remplaçons simplement le <%= ... %>
par le code de ce partiel, nous avons un problème - immédiatement après le, href=
il y a un guillemet double! Le javascript ne sera pas valide:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
Pour que cela ne se produise pas, vous voulez échapper ces caractères spéciaux afin que votre chaîne ne soit pas coupée - vous avez besoin de quelque chose qui génère ceci à la place:
<a href=\"/mycontroller/myaction\">Action!</a>
C'est ce que escape_javascript
fait. Il s'assure que la chaîne retournée ne "cassera" pas le javascript. Si vous l'utilisez, vous obtiendrez la sortie souhaitée:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
Cordialement!