Rails為何要使用 escape_javascript?

Posted by Noel on 2015-09-25

前言:

在 Rails 裡,為了某些 AJAX 效果,我們會使用RJS(Remote Javascript),簡單地說就是發送了個 js 請求給 server,rails controller 做了某些事情後會render像是 *.js.erb 的檔案,在這檔案裡我們可以混用 ruby 與 js,所以可以做些我們想做的事之後再編譯成 js code 並回傳給 browser,然後 browser 直接處理這段 js 並改變網頁文件。


而通常我們希望改變的網頁上的某些區塊例如:某表單、某欄位,所以我們最快的方法是使用 Rails 提供的方法像是 render來直接產生一些 html,像是增加一個圖片連結:

1
<a href="http://somehost/resources/123456">Hello World!</a>

我們會使用$('#some_id').append("<%= render some_link %>")
來更改頁面,但如果直接這樣用把剛剛那段 html 當做參數丟進去就會有問題,因為append("<%= ... %>") 的那雙引號會造成 bug,會變成:

1
2

$('#some_id').append("<a href="http://somehost/resources/123456">Hello World</a>")

兩個雙引號組成的字串,會因為其他的雙引號造成問題,
所以我們需要escape_javascript來幫忙跳脫雙引號的束縛,`

1
2
3
4

$('#some_id').append("<%= escape_javascript render some_link %>")`:
// 會等於
$('#some_id').append("<a href=\"http://somehost/resources/123456\">Hello World</a>")

那如果我們不用雙引號,改用單引號包起來的話呢?

因為在jQuery我們的確會這麼寫

1
$('#some_id').append('"<p>Hello World</p>"')

但實際上只用單引號包起來仍然會碰到字串內容如果有斷行(\n)而造成的問題,所以也要交給escape_javascript處理掉。

所以,為了在RJS等使用情境下,為了取得

  1. 有效且可執行的 javascript code
  2. 跳脫雙引號帶來的束縛

參考