Sẽ dễ hiểu hơn nếu bạn chia mã thành hai phần.
Phần đầu tiên $("#reviews").append("<%= ... %>");
là javascript với erb. Điều này có nghĩa là ý <%= ... %>
muốn được thay thế bằng bất kỳ mã ruby nào bên trong nó trả về. Kết quả của sự thay thế đó phải là javascript hợp lệ, nếu không nó sẽ gây ra lỗi khi máy khách cố gắng xử lý nó. Vì vậy, đó là điều đầu tiên: bạn cần javascript hợp lệ .
Một điều khác cần lưu ý là bất kỳ thứ gì ruby tạo ra đều phải được chứa bên trong một chuỗi javascript có dấu ngoặc kép - hãy chú ý đến dấu ngoặc kép xung quanh <%= ... %>
. Điều này có nghĩa là javascript được tạo sẽ giống như sau:
$("#reviews").append("...");
Bây giờ chúng ta hãy kiểm tra phần ruby bên trong <%= ... %>
. Làm gì render(:partial => @review)
? Nó đang hiển thị một phần - có nghĩa là nó có thể hiển thị bất kỳ loại mã nào - html, css ... hoặc thậm chí nhiều javascript!
Vì vậy, điều gì sẽ xảy ra nếu một phần của chúng ta chứa một số html đơn giản, như đoạn này?
<a href="/mycontroller/myaction">Action!</a>
Hãy nhớ rằng javascript của bạn đang sử dụng một chuỗi được trích dẫn kép làm tham số? Nếu chúng ta chỉ thay thế <%= ... %>
mã bằng mã của phần đó, thì chúng ta gặp sự cố - ngay sau href=
đó có một dấu ngoặc kép! Javascript sẽ không hợp lệ:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
Để điều này không xảy ra, bạn muốn thoát các ký tự đặc biệt này để chuỗi của bạn không bị cắt - thay vào đó bạn cần một thứ gì đó tạo ra điều này:
<a href=\"/mycontroller/myaction\">Action!</a>
Điều này làm gì escape_javascript
. Nó đảm bảo rằng chuỗi được trả về sẽ không "phá vỡ" javascript. Nếu bạn sử dụng nó, bạn sẽ nhận được đầu ra mong muốn:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
Trân trọng!