我正在使用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中运行吗? 感谢
答案 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")} })
祝你好运。 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。