Lebih mudah dipahami jika Anda membagi kode menjadi dua bagian.
Bagian pertama $("#reviews").append("<%= ... %>");
adalah javascript dengan erb. Ini berarti bahwa <%= ... %>
wasiat akan diganti dengan apa pun yang dikembalikan kode ruby di dalamnya. Hasil dari penggantian tersebut harus berupa javascript yang valid, jika tidak maka akan terjadi error saat klien mencoba untuk memprosesnya. Jadi itu hal pertama: Anda membutuhkan javascript yang valid .
Hal lain yang perlu diperhatikan adalah bahwa apa pun yang dihasilkan ruby harus terkandung di dalam string javascript dengan tanda kutip ganda - perhatikan tanda kutip ganda di sekitar <%= ... %>
. Artinya, javascript yang dihasilkan akan terlihat seperti ini:
$("#reviews").append("...");
Sekarang mari kita periksa bagian ruby di dalam file <%= ... %>
. Apa yang render(:partial => @review)
dilakukannya? Ini merender sebagian - yang berarti dapat merender segala jenis kode - html, css ... atau bahkan lebih banyak javascript!
Jadi, apa yang terjadi jika parsial kita berisi beberapa html sederhana, seperti ini?
<a href="/mycontroller/myaction">Action!</a>
Ingat bahwa javascript Anda menggunakan string kutip ganda sebagai parameter? Jika kita hanya mengganti <%= ... %>
dengan kode parsial itu, maka kita punya masalah - segera setelah href=
ada tanda kutip ganda! Javascript tidak akan valid:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
Agar ini tidak terjadi, Anda ingin keluar dari karakter khusus ini sehingga string Anda tidak dipotong - Anda memerlukan sesuatu yang menghasilkan ini sebagai gantinya:
<a href=\"/mycontroller/myaction\">Action!</a>
Inilah yang escape_javascript
dilakukannya. Ini memastikan bahwa string yang dikembalikan tidak akan "merusak" javascript. Jika Anda menggunakannya, Anda akan mendapatkan hasil yang diinginkan:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
Salam!