É mais fácil entender se você dividir o código em duas partes.
A primeira parte $("#reviews").append("<%= ... %>");
é javascript com erb. Isso significa que o <%= ... %>
será substituído por qualquer que seja o código rubi dentro dele. O resultado dessa substituição deve ser um javascript válido, caso contrário, ocorrerá um erro quando o cliente tentar processá-lo. Então essa é a primeira coisa: você precisa de um javascript válido .
Outra coisa a considerar é que tudo o que o ruby gera deve estar contido em uma string javascript com aspas duplas - observe as aspas duplas ao redor do <%= ... %>
. Isso significa que o javascript gerado terá a seguinte aparência:
$("#reviews").append("...");
Agora vamos examinar a parte do ruby dentro do <%= ... %>
. O querender(:partial => @review)
faz? Está renderizando um parcial - o que significa que poderia renderizar qualquer tipo de código - html, css ... ou ainda mais javascript!
Então, o que acontece se o nosso parcial contiver algum html simples, como este?
<a href="/mycontroller/myaction">Action!</a>
Lembre-se de que seu javascript estava usando uma string de aspas duplas como parâmetro? Se simplesmente substituirmos o <%= ... %>
código pelo parcial, teremos um problema - imediatamente após a href=
aspas duplas! O javascript não será válido:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
Para que isso não aconteça, você deseja escapar desses caracteres especiais para que sua string não seja cortada - você precisa de algo que gere isso:
<a href=\"/mycontroller/myaction\">Action!</a>
É isso que escape_javascript
faz. Ele garante que a string retornada não "quebre" o javascript. Se você usá-lo, obterá a saída desejada:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
Saudações!