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_javascriptmacht. 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!