Il est plus facile de 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 ce que le code ruby qu'il contient renvoie. Le résultat de ce remplacement doit être un javascript valide, sinon une erreur se produira lorsque le client essaiera de le traiter. Donc c'est la première chose : vous avez besoin de 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 doubles - remarquez les guillemets doubles autour de l'élément <%= ... %>
. Cela signifie que le javascript généré ressemblera à ceci :
$("#reviews").append("...");
Maintenant, examinons la partie ruby à l'intérieur de l'élément <%= ... %>
. Que fait render(:partial => @review)
faire ? Il effectue un rendu partiel - ce qui signifie qu'il peut rendre n'importe quel type de code - html, css ... ou même plus de javascript !
Alors, que se passe-t-il si notre partiel contient un simple html, comme celui-ci ?
<a href="http://stackoverflow.com/mycontroller/myaction">Action!</a>
Vous vous souvenez que votre javascript prenait une chaîne de caractères entre guillemets comme paramètre ? Si nous remplaçons simplement le <%= ... %>
avec le code de ce partiel, alors 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="http://stackoverflow.com/mycontroller/myaction">Action!</a>");
Pour que cela ne se produise pas, vous devez s'é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>
Ce qui escape_javascript
fait. Il s'assure que la chaîne retournée ne "casse" pas le javascript. Si vous l'utilisez, vous obtiendrez le résultat souhaité :
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
Salutations !