406在Firefox中使用Jquery $ .post但在Safari或Chrome中不使用时,不可接受错误

时间:2010-02-11 09:12:20

标签: jquery ruby-on-rails firefox

我正在使用Jquery(1.3.2)$ .post命令来触发对rails服务器的ajax调用。

该代码在Safari和Google Chrome(Mac)上运行良好,但是当我在Firefox(3.5.7)上尝试时,我得到了一个奇怪的“406 Not Acceptable”错误。

当我查看标题时,Firefox表示它只接受“text / javascript”响应。并且响应Content-Type是'text / html;字符集= UTF-8' 。

在Chrome中,接受的类型是'application / json,text / javascript, / ,text / javascript',响应Content-Type是'application / json;字符集= UTF-8' 。

我尝试将rails中的内容类型强制为'text / javascript'

format.json do
   render :json => @races.to_json, :content_type => 'text/javascript'
end

Chrome中的内容类型确实已更改,但Firefox中的内容类型仍为“text / html”。

这是我用来触发ajax调用的代码。

$.post(
    "/locator",
    params, 
    function(data){...},
    "json"
);

我有什么办法可以让它在Firefox中运行吗? 感谢

5 个答案:

答案 0 :(得分:4)

在帖子调用中为您的网址添加.json扩展程序

$.post(
"/locator.json"
...

或者(可能更好)将以下内容添加到application.js以设置所有ajax请求的标头

jQuery.ajaxSetup({ 
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} 
})

答案 1 :(得分:4)

有同样的问题。这似乎是一个火狐问题。

这有效:

jQuery.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript,application/javascript,text/html")} })

Credit goes to this blog.

祝你好运。 AsbjørnMorell

答案 2 :(得分:0)

不同的浏览器看到不同的HTTP标头是没有意义的。也许这是一个缓存问题。

答案 3 :(得分:0)

我在$ .ajaxSetup调用期间使用contentType选项来显式设置内容类型。跨浏览器的工作: http://api.jquery.com/jQuery.ajax/

答案 4 :(得分:-1)

以上建议(atmorell,Paul Groves)都没有为我修好......然后我发现jquery $.ajax not working in firefox against rails (406 response) (works in chrome & IE)

正如我在那里评论的那样,接受的答案有效! (使用format.js而不是format.json,以及“render:text => item.to_json”)

为了记录,我不是直接打电话给.ajax;而我正在使用JQuery.UI的自动填充程序:

$(document).ready(function() {
    $("input#task_summary_task_wbs").autocomplete({
        source: "/tasks/summary.js"
    });
});

这在我的TasksController中:

# GET /tasks/summary.js
def summary
  @tasks = Task.find(:all,
                     :conditions => ['is_summary = true AND wbs like ?',
                                     "%#{params[:term]}%"],
                     :order => :wbs)
  respond_to do |format|
    format.js {
      render :text => @tasks.collect {|t| t.wbs_name}.to_json
    }
  end
end

la Railscast#102。