怪异的“406不能接受”的错误

当我尝试通过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 

我破解了这个案子!

我发送一个format参数与我的get请求,以告诉服务器发送给我降价,而不是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的情况下工作的头文件。在任何情况下,工作的接受string是:

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

我会研究的另一个领域是JSON生产控制器。 如果控制器缺less格式指令来指定它可以返回JSON作为响应,那也可能导致406错误。

检查你的application.js是否需要jquery_ujs

 //= require jquery_ujs 

你可以尝试没有设置Accept Header? 即使没有Accept头,它也应该可以工作。

只需在控制器操作方法格式块中使用此代码:

 format.js { render :nothing => true } 

如果你正在使用jRails,这对我造成了很多问题,这里是我的application.js文件:

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

这是通过Apache吗? 您可能需要查看http://forums.alwayswebhosting.com/showthread.php?p=8381 ,其中描述了安全策略干扰请求的情况。

编辑 :上面引用的URL主张closures整个站点的请求嗅探安全策略,这使得网站易受攻击。 在URL中规定的.htaccess中将SecFilterEngine选项设置为Off,应该只将问题的根源归结为零。 这不应该被认为是一个长期的解决scheme。

对我来说,这是一个简单的before_filter,它限制了一个呈现js文件的动作,一旦我在before_filter块中添加:except => [:action]就行了。

我打电话给JS格式的url,但在控制器中:

 respond_to do |format| format.html end 

这在Safari中运行良好,但不是与Firefox。

自然我错过了一些东西,应该是:

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

现在这两个浏览器都很好。

当我忘记添加:remote => true时,我遇到了这个问题,我的Ajax表单。

另一个隐晦的“窍门”在这里是,如果你打电话给你的控制器的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.我们不会谈论我花了多less时间在这一次。