[英]Weird “406 not acceptable” error
當我嘗試通過Javascript點擊此操作時,我收到406 Not Acceptable
錯誤:
def show
@annotation = Annotation.find_by_id(params[:id])
respond_to do |format|
format.html {
if @annotation.blank?
redirect_to root_path
else
redirect_to inline_annotation_path(@annotation)
end
}
format.js {
if params[:format] == "raw"
render :text => @annotation.body.to_s
else
render :text => @annotation.body.to_html
end
}
end
end
這是來自jQuery,但我在發送之前做的正確:
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("Accept", "text/javascript");
},
cache: false
});
這是我的請求標題:
Host localhost:3000
User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
Accept text/javascript
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
X-Requested-With XMLHttpRequest
Content-Type application/x-www-form-urlencoded
我破了這個案子!
我發送了一個帶有get請求的format
參數,以告訴服務器向我發送markdown而不是HTML。 這是我的Javascript:
$.get("/annotations/" + annotation_id, {format: 'raw'}, function(data) {
});
然后我在format.js
塊中尋找這個參數:
format.js {
if params[:format] == "raw"
render :text => @annotation.body.to_s
else
render :text => @annotation.body.to_html
end
}
但顯然format
參數會混淆respond_to
塊。 我將它從{format: 'raw'}
改為{markdown: 'true'}
並且它有效。
我想這是Rails中的一個錯誤?
在respond_to塊中包含“format.js”
當使用HTTPRiot從iPhone應用程序連接到JSON渲染Web應用程序時,這種情況發生在我身上。 似乎問題是由於Rails期望一個Accept
HTTP標頭,它很好,舒適。 因此,我使用Firefox的LiveHTTPHeaders擴展來查看沒有406的頭文件。無論如何,工作的Accept字符串是:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
我要研究的另一個領域是產生JSON的控制器。 如果控制器缺少一個format指令來指定它可以返回JSON作為響應,那么也可能導致406錯誤。
檢查您的application.js是否需要jquery_ujs
//= require jquery_ujs
你可以嘗試不設置Accept Header嗎? 即使沒有Accept標頭,它實際上應該工作。
只需在控制器操作方法格式塊中使用此代碼:
format.js { render :nothing => true }
這是通過Apache提供的嗎? 您可能需要查看http://forums.alwayswebhosting.com/showthread.php?p=8381 ,其中介紹了安全策略干擾請求的方案。
編輯 :上面引用的URL主張在整個站點上關閉請求嗅探安全策略,這會使站點容易受到攻擊。 在.htaccess中將SecFilterEngine選項設置為Off,這是URL中規定的,應該只對問題的來源進行歸零。 它不應被視為長期解決方案。
如果您使用的是jRails,這對我來說會造成很多問題,這是我的application.js
文件:
$(document).ready(function () {
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "text/javascript, text/html, application/xml, text/xml, */*");
}
});
});
對我來說,這是一個簡單的before_filter,它限制了一個呈現js文件的動作,一旦我將:except => [:action]添加到before_filter塊就可以了。
另一個陰險的“Gotcha”就是如果你用一個form_for調用你的控制器,那意外地有一個額外的不必要的參數 。 Rails可以將附加參數解釋為格式請求,您將得到406。
例:
= form_for parking_permit, url: permit_group_parking_permits_path(@permit_group.id, useless_id), method: :get do |f| ...
在上面的示例中,您RAKE ROUTES並確定permit_group_parking_permits_path除了permit_group id之外不需要任何其他內容...
如果您看到正在調用您的方法,例如/model/action.1?blahblahblah ,那么“.1”就是您的提示。
這將返回406.我們不會談論我花了多少時間在這上面。
當我忘記添加:remote => true
到我的Ajax表單時,我遇到了這個問題。
我正在調用js格式的url但是在控制器中有這個:
respond_to do |format|
format.html
end
這在Safari中運行良好,但不適用於Firefox。
自然我錯過了什么,應該是:
respond_to do |format|
format.html
format.js
end
現在兩個瀏覽器都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.