Es ist einfacher zu verstehen, wenn Sie den Code in zwei Teile teilen.
Der erste Teil $("#reviews").append("<%= ... %>");
ist Javascript mit erb. Dies bedeutet, dass der <%= ... %>
durch den darin enthaltenen Ruby-Code ersetzt wird. Das Ergebnis dieser Ersetzung muss gültiges Javascript sein, andernfalls wird ein Fehler ausgegeben, wenn der Client versucht, ihn zu verarbeiten. Das ist also das Erste: Sie benötigen gültiges Javascript .
Eine andere Sache, die berücksichtigt werden muss, ist, dass alles, was Ruby erzeugt, in einer Javascript-Zeichenfolge mit doppelten Anführungszeichen enthalten sein muss - beachten Sie die doppelten Anführungszeichen um das <%= ... %>
. Dies bedeutet, dass das generierte Javascript folgendermaßen aussieht:
$("#reviews").append("...");
Lassen Sie uns nun den Rubinteil im Inneren untersuchen <%= ... %>
. Was macht render(:partial => @review)
das Es wird ein Teil gerendert - was bedeutet, dass es jede Art von Code rendern kann - HTML, CSS ... oder noch mehr Javascript!
Was passiert also, wenn unser Teil ein einfaches HTML wie dieses enthält?
<a href="/mycontroller/myaction">Action!</a>
Denken Sie daran, dass Ihr Javascript eine Zeichenfolge in doppelten Anführungszeichen als Parameter verwendet hat? Wenn wir das einfach durch den <%= ... %>
Code dieses Teils ersetzen , haben wir ein Problem - unmittelbar danach href=
gibt es ein doppeltes Anführungszeichen! Das Javascript ist ungültig:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
Damit dies nicht passiert, möchten Sie diesen Sonderzeichen entkommen , damit Ihre Zeichenfolge nicht abgeschnitten wird. Stattdessen benötigen Sie etwas, das dies generiert:
<a href=\"/mycontroller/myaction\">Action!</a>
Das was escape_javascript
macht. Es stellt sicher, dass die zurückgegebene Zeichenfolge kein Javascript "bricht". Wenn Sie es verwenden, erhalten Sie die gewünschte Ausgabe:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
Grüße!