2009-09-12 137 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.我们不会谈论我花了多少时间在这一次。