ง่ายกว่าที่จะเข้าใจหากคุณแบ่งรหัสออกเป็นสองส่วน
ส่วนแรก$("#reviews").append("<%= ... %>");
คือ javascript กับ erb ซึ่งหมายความว่า<%= ... %>
จะถูกแทนที่ด้วยรหัสทับทิมที่อยู่ข้างในจะส่งกลับ ผลลัพธ์ของการแทนที่นั้นต้องเป็น javascript ที่ถูกต้องมิฉะนั้นจะทำให้เกิดข้อผิดพลาดเมื่อไคลเอ็นต์พยายามประมวลผล ดังนั้นนั่นคือสิ่งแรกที่คุณต้องจาวาสคริปต์ที่ถูกต้อง
สิ่งที่ต้องคำนึงถึงอีกประการหนึ่งคือสิ่งที่ทับทิมสร้างขึ้นจะต้องอยู่ในสตริงจาวาสคริปต์ที่มีเครื่องหมายคำพูดคู่ - สังเกตเครื่องหมายคำพูดคู่รอบ ๆ<%= ... %>
. ซึ่งหมายความว่าจาวาสคริปต์ที่สร้างขึ้นจะมีลักษณะดังนี้:
$("#reviews").append("...");
ตอนนี้เรามาตรวจสอบส่วนทับทิมภายในไฟล์<%= ... %>
. อะไรrender(:partial => @review)
ทำอย่างไร เป็นการแสดงผลบางส่วน - ซึ่งหมายความว่าสามารถแสดงรหัสประเภทใดก็ได้ - html, css ... หรือจาวาสคริปต์มากกว่า!
แล้วจะเกิดอะไรขึ้นถ้าบางส่วนของเรามี html ง่ายๆเช่นนี้?
<a href="/mycontroller/myaction">Action!</a>
จำไว้ว่าจาวาสคริปต์ของคุณใช้สตริงที่ยกมาสองครั้งเป็นพารามิเตอร์? หากเราเพียงแค่แทนที่<%= ... %>
ด้วยรหัสของบางส่วนนั้นแสดงว่าเรามีปัญหา - ทันทีที่href=
มีเครื่องหมายคำพูดคู่! จาวาสคริปต์จะไม่ถูกต้อง:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
เพื่อไม่ให้สิ่งนี้เกิดขึ้นคุณต้องหลีกเลี่ยงอักขระพิเศษเหล่านี้เพื่อไม่ให้สตริงของคุณถูกตัด - คุณต้องมีสิ่งที่สร้างสิ่งนี้แทน:
<a href=\"/mycontroller/myaction\">Action!</a>
นี้สิ่งที่escape_javascript
ไม่ ตรวจสอบให้แน่ใจว่าสตริงที่ส่งคืนจะไม่ "ทำลาย" จาวาสคริปต์ หากคุณใช้งานคุณจะได้ผลลัพธ์ที่ต้องการ:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
ความนับถือ!