È più facile capire se si divide il codice in due parti.
La prima parte $("#reviews").append("<%= ... %>");
è javascript con erb. Ciò significa che lo <%= ... %>
verrà sostituito da qualunque sia il codice rubino 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 dello javascript valido.
Un'altra cosa da tenere in considerazione è che qualsiasi rubino generato deve essere contenuto all'interno di una stringa javascript con virgolette doppie: notare le doppie virgolette attorno allo <%= ... %>
. Ciò significa che il javascript generato sarà simile a questa:
$("#reviews").append("...");
Ora esaminiamo la parte rubino all'interno del <%= ... %>
. Cosa fa render(:partial => @review)
? Si tratta di un rendering parziale - il che significa che potrebbe essere il rendering di qualsiasi tipo di codice: html, css ... o anche più javascript!
Quindi, cosa succede se il nostro partial contiene un semplice html, come questo?
<a href="/mycontroller/myaction">Action!</a>
Ricordate che il vostro javascript stava prendendo una stringa doppia virgola come parametro? Se sostituiamo semplicemente il <%= ... %>
con il codice di quel parziale, allora abbiamo un problema - immediatamente dopo lo href=
c'è una doppia citazione!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, si vuole fuga questi caratteri speciali in modo che lo stringa non è tagliato - avete bisogno di qualcosa che genera questo, invece:
<a href=\"/mycontroller/myaction\">Action!</a>
Ciò che fa escape_javascript
. Si assicura che la stringa restituita non "spezzerà" javascript. Se lo usi, otterrai l'output desiderato:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
Saluti!
Cordiali saluti, la risposta accettata qui non è la risposta corretta. Kikito's è – Steve