为什么 "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 提出请求)