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

我正在使用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中运行吗? 谢谢

在post调用中为您的URL添加.json扩展名

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

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

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

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

这有效:

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

信用转到这个博客。

最好的祝福。 AsbjørnMorell

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

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

以上建议都没有(atmorell,Paul Groves)为我修复了…然后我发现jquery $ .ajax不能在firefox中使用rails(406响应)(适用于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。