È più facile capire se dividi il codice in due parti.
La prima parte $("#reviews").append("<%= ... %>");è javascript con erb. Ciò significa che <%= ... %>verrà sostituito da qualunque cosa restituisca il codice ruby al suo interno. Il risultato di tale sostituzione deve essere javascript valido, altrimenti genererà un errore quando il client tenta di elaborarlo. Quindi questa è la prima cosa: hai bisogno di JavaScript valido .
Un'altra cosa da tenere in considerazione è che qualsiasi cosa generata da ruby deve essere contenuta all'interno di una stringa javascript con virgolette doppie: notare le virgolette doppie attorno al file <%= ... %>. Ciò significa che il javascript generato sarà simile a questo:
$("#reviews").append("...");
Ora esaminiamo la parte rubino all'interno del file <%= ... %>. Cosa fa render(:partial => @review)? Sta eseguendo un rendering parziale, il che significa che potrebbe eseguire il rendering di qualsiasi tipo di codice: html, css ... o anche più javascript!
Allora, cosa succede se il nostro partial contiene un semplice html, come questo?
<a href="/mycontroller/myaction">Action!</a>
Ricordi che il tuo javascript prendeva come parametro una stringa tra virgolette? Se sostituiamo semplicemente il <%= ... %>con il codice di quel parziale, allora abbiamo un problema - subito dopo href=c'è un doppio apice! Il javascript non sarà valido:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
Affinché ciò non accada, vuoi sfuggire a questi caratteri speciali in modo che la tua stringa non venga tagliata - hai bisogno di qualcosa che generi questo invece:
<a href=\"/mycontroller/myaction\">Action!</a>
Questo cosa escape_javascriptfa. Si assicura che la stringa restituita non "interrompa" javascript. Se lo usi, otterrai l'output desiderato:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
Saluti!