簡體   English   中英

奇怪的“406不可接受”的錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM