[英]rails 3 javascript not executed despite a text/javascript content-type in response
[英]Rails 3 prototype render :update response has text/html content-type
我正在嘗試使用原型和Rails 2.3.11編寫的一些RJS代碼在Rails 3.2.1中工作
我有prototype-rails
gem,所以render :update do |page|
工作,我正在使用一個表單:remote => true
,它向控制器發送一個ajax請求,並且javascript看起來好像正在生成。
但是,響應標題中的content-type是text/html; charset=utf-8
text/html; charset=utf-8
,應該是text/javascript
。
在控制器中,我這樣稱呼它:
render :update do |page|
if @step.errors.empty?
page.redirect_to how_to_path(@article.id)
else
page.replace_html 'add_step_form', :partial => 'how_to/add_step', :locals => {:step => @step, :altered => true}
end
end
它似乎生成window.location.href...
和Element.update...
代碼確定,但它沒有執行,因為內容類型是錯誤的。
我可能做錯了會導致這種情況嗎? 我需要一個能讓原型工作的rjs的解決方案。 jQuery可能會在未來使用,但現在進行更改不是一種選擇。
更新:我已經嘗試了其他一些編寫代碼的方法,包括在render
指定:content_type => "text/javascript"
,將其包裝在帶有format.js
的respond_to
塊中,並將其重寫為js.erb
文件,但是所有仍然返回text/html
作為響應頭中的內容類型。
更新我有點弄清楚如何通過在render
之前在控制器中添加headers["Content-Type"] = "text/javascript; charset=utf-8"
來獲得預期的行為,但這看起來並不是最好的如果我必須在每個RJS實例之前明確添加它,那么這樣做的方法。 如果有人能想出一個,我想要一個更清潔的解決方案。
更新事實證明,在將content-type設置為text / html的每個請求之前,我們運行了一個before_filter
。 我刪除了這個,並且能夠刪除我添加的所有headers["Content-Type"]
代碼。 它在我的開發環境中工作,但在我們的測試驗證環境中沒有。 結果是我們在那里緩存了舊資產,因此驗證運行原型1.6.1,而我的本地開發環境有1.7.0。 這導致rails.js
無法在驗證中編譯,因此所有請求都有一個Accepts: text/html
而不是text/javascript
。 刷新緩存加載了較新版本的原型並修復了問題。
事實證明,我們在每個將content-type設置為text / html的請求之前運行了一個before_filter。 我刪除了它,它沒有下面的黑客工作。
但是如果你需要一個解決方法,這就是我在下面做的。
我唯一想要做的就是在render :update
之前添加headers["Content-Type"] = "text/javascript; charset=utf-8"
render :update
headers["Content-Type"] = "text/javascript; charset=utf-8"
render :update do |page|
if @step.errors.empty?
page.redirect_to how_to_path(@article.id)
else
page.replace_html 'add_step_form', :partial => 'how_to/add_step', :locals => {:step => @step, :altered => true}
end
end
不幸的是,我必須在RJS render :update
的代碼中的每個地方添加它render :update
被調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.