2009-09-12 473 views
41

當我嘗試打通過JavaScript這個動作,我得到一個錯誤406 Not Acceptable怪異「406不能接受的」錯誤

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的,但我做了正確的beforeSend東西:

$.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 
+1

請將您的答案標記爲正確的答案......從來沒有想過我會添加關於該評論的評論,但它使查找答案變得容易得多。 – erroric 2013-06-10 17:08:10

+0

看看這裏:http://stackoverflow.com/questions/25910031/jquery-autocomplete-throws-406-not-acceptable-error – 2014-12-29 13:32:51

回答

30

我破解了這個案子!

我發送了一個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中的一個bug?

+10

這不是一個錯誤,而是想要的行爲:Rails使用Accept Headers和format參數來確定它是否會響應HTML,JavaScript,XML,JSON或其他。 所以在你的情況下的格式。js {}塊從未被調用,因爲Rails認爲你想要的格式爲「raw」而不是格式爲「js」的格式。 – severin 2010-05-25 12:46:33

+2

你說得對 - 我應該註冊一個Markdown mimetype(http://stackoverflow.com/questions/2456219/add-a-custom-format-in-rails-that-will-work-with-respond-to)並添加了一個'format.markdown'塊 – 2010-05-26 04:22:13

0

是通過Apache這個服務?你可能想看看http://forums.alwayswebhosting.com/showthread.php?p=8381,它描述了安全策略干擾請求的場景。

編輯:上面引用的URL主張在整個站點上關閉請求嗅探安全策略,這使得站點易受攻擊。在URL中規定的.htaccess中將SecFilterEngine選項設置爲Off,應該僅針對問題的根源。這不應該被認爲是一個長期的解決方案。

+0

沒有工作<:( – 2009-09-12 06:30:01

+0

你打算髮回的數據是什麼客戶端作爲你的響應的一部分看起來像嗎?這是JSON,HTML,JavaScript? – 2009-09-12 08:29:30

+0

@霍雷斯:請參閱我的更新到這篇文章 – 2009-09-12 08:32:04

0

如果您正在使用jRails這是造成很多對我的問題,這是我的application.js文件:

$(document).ready(function() { 
    $.ajaxSetup({ 
     beforeSend: function (xhr) { 
      xhr.setRequestHeader("Accept", "text/javascript, text/html, application/xml, text/xml, */*"); 
     } 
    }); 
}); 
+0

沒有工作<:( – 2009-09-12 06:28:48

+0

http:// gist。 github.com/185743 - 試試這個fo r你的jRails.js文件。 – Garrett 2009-09-12 06:56:38

+0

我實際上甚至沒有使用jRails(只是普通的jQuery) – 2009-09-12 18:42:46

2

你可以嘗試沒有設定接受頭?即使沒有Accept頭,它也應該可以工作。

+0

仍然不起作用(太令人沮喪了!) – 2009-09-12 18:43:28

0

對我來說,這是一個簡單的before_filter,它限制了一個呈現js文件的動作,一旦我在before_filter塊中添加:except => [:action]就沒有問題。

5

在您的respond_to塊「format.js」

2

只要使用這個代碼在控制器的操作方法格式化塊:使用HTTPRiot連接到JSON再現web應用程序時

format.js { render :nothing => true } 
5

這發生在我身上從iPhone應用程序。看來這個問題是由於Rails期待一個Accept HTTP頭,它很好,很舒服。因此,我使用Firefox的LiveHTTPHeaders擴展名來查看沒有406的情況下工作的標頭。在任何情況下工作的接受的字符串是:

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

,我會研究的另一個領域是JSON生產控制器。如果控制器缺少format指令來指定它可以返回JSON作爲響應,那也可能導致406錯誤。

0

我在忘記將:remote => true添加到我的Ajax表單時遇到此問題。

0

我打電話了JS格式的URL,但在控制器中有這樣的:

respond_to do |format| 
    format.html 
end 

這在Safari工作正常,但不能用Firefox。

當然,我失去了一些東西,應該是:

respond_to do |format| 
    format.html 
    format.js 
end 

,現在這兩個瀏覽器的罰款。

3

檢查您的application.js的要求jquery_ujs

//= require jquery_ujs 
0

另一個陰險的「疑難雜症」在這裏,如果你有打電話給你的控制器的form_for是偶然有一個額外的不-必要的參數。額外的參數可以通過Rails的解釋爲格式的請求,你會得到406

例子:

= form_for parking_permit, url: permit_group_parking_permits_path(@permit_group.id, useless_id), method: :get do |f| ...

在上面的例子,你來耙路線和確定permit_group_parking_permits_path不除了permit_group ID之外的任何東西...

如果你看到你的方法被調用,如/model/action.1?blahblahblah「.1」是你的提示。

這將返回406.我們不會談論我花了多少時間在這一次。

相關問題