为什么 "Completed 406 Not Acceptable" 在删除 respond_to 后消失了?
why "Completed 406 Not Acceptable" has gone after removing respond_to?
当我使用 $.ajax()
通过以下 respond_to
块提交表单内容时:
respond_to do
render :json => { :url => question_path(resource, :recent => :true),
:uploadPath => question_path(@question, :format => "json"),
:editPath => edit_question_path(@question),
:exitPath => question_path(resource)
}
end
我收到一个错误:
Completed 406 Not Acceptable in 124690.7ms (Views: 0.4ms | ActiveRecord: 16.7ms | Sphinx: 0.0ms)
我去掉respond_to
后,如上代码改为:
render :json => { :url => question_path(resource, :recent => :true),
:uploadPath => question_path(@question, :format => "json"),
:editPath => edit_question_path(@question),
:exitPath => question_path(resource)
}
错误消失了,为什么会这样?我想念什么?谢谢!
respond_to
用于对同一控制器操作产生不同的响应。例如,您可能想为浏览器呈现 HTML,但为 API 客户端呈现 JSON。您列出了您可以生成的所有响应(以及它们应该如何生成),然后 rails 选择与请求匹配的响应:
respond_to do |format|
format.html { ... }
format.json { ... }
end
在上面的示例中,rails 知道如何生成 HTML 和 JSON 响应,但是如果请求进来请求 XML 响应,那么 rails 会产生 406 错误(不可接受),因为它不知道如何产生这样的响应。
在你的代码片段中你调用了 respond_to
所以你告诉 rails 只使用块给出的响应格式但你没有定义任何响应格式(你没有使用对象屈服于块),因此 rails 产生 406.
当您删除对 respond_to
的调用时 Rails 不再担心尝试选择正确的响应格式而只使用您的调用来呈现(并且无论请求是什么格式都会这样做正在要求)。
如果你想使用 respond_to
你会做
respond_to do |format|
format.json { render :json => { ... }}
end
这样做时,您确实需要确保请求正在请求 json - 如果 rails 虽然它正在请求 HTML,那么您将返回到 406 错误。您可以为此使用 jQuery 的 dataType
选项或使用 .json 的扩展名(即向 /foo/bar.json
提出请求)
当我使用 $.ajax()
通过以下 respond_to
块提交表单内容时:
respond_to do
render :json => { :url => question_path(resource, :recent => :true),
:uploadPath => question_path(@question, :format => "json"),
:editPath => edit_question_path(@question),
:exitPath => question_path(resource)
}
end
我收到一个错误:
Completed 406 Not Acceptable in 124690.7ms (Views: 0.4ms | ActiveRecord: 16.7ms | Sphinx: 0.0ms)
我去掉respond_to
后,如上代码改为:
render :json => { :url => question_path(resource, :recent => :true),
:uploadPath => question_path(@question, :format => "json"),
:editPath => edit_question_path(@question),
:exitPath => question_path(resource)
}
错误消失了,为什么会这样?我想念什么?谢谢!
respond_to
用于对同一控制器操作产生不同的响应。例如,您可能想为浏览器呈现 HTML,但为 API 客户端呈现 JSON。您列出了您可以生成的所有响应(以及它们应该如何生成),然后 rails 选择与请求匹配的响应:
respond_to do |format|
format.html { ... }
format.json { ... }
end
在上面的示例中,rails 知道如何生成 HTML 和 JSON 响应,但是如果请求进来请求 XML 响应,那么 rails 会产生 406 错误(不可接受),因为它不知道如何产生这样的响应。
在你的代码片段中你调用了 respond_to
所以你告诉 rails 只使用块给出的响应格式但你没有定义任何响应格式(你没有使用对象屈服于块),因此 rails 产生 406.
当您删除对 respond_to
的调用时 Rails 不再担心尝试选择正确的响应格式而只使用您的调用来呈现(并且无论请求是什么格式都会这样做正在要求)。
如果你想使用 respond_to
你会做
respond_to do |format|
format.json { render :json => { ... }}
end
这样做时,您确实需要确保请求正在请求 json - 如果 rails 虽然它正在请求 HTML,那么您将返回到 406 错误。您可以为此使用 jQuery 的 dataType
选项或使用 .json 的扩展名(即向 /foo/bar.json
提出请求)