rails如何确定传入的请求格式?

时间:2011-06-06 14:49:31

标签: ruby-on-rails controller format

我只是想知道rails如何知道请求的格式才能正确输入名称:

respond_to do |format|
  format.html
  format.xml
  format.json
end

作为一个例子,考虑一下我面临的这种情况。假设通过javascript(使用jQuery)我发出一个POST请求,明确 dataType:json

$.ajax({
      type: 'POST',
      url: 'example.com',
      data: data,
      dataType: 'json'
    });

当此请求到达控制器操作时,使用ruby调试器站在其中,我检查@ request.format,我可以看到content-type是application / json。然后控制器按预期响应json格式。

但我对路线中指定的格式符号感到困惑。假设向 example.com/parts.json 发出请求,但在请求中,内容类型为application / html或application / xml。 控制器是否响应json格式或html或xml ??

谢谢!

2 个答案:

答案 0 :(得分:7)

来自ActionController::MimeResponds:“Rails根据客户端提交的HTTP Accept标头确定所需的响应格式。”

答案 1 :(得分:0)

传入的 Content-Type 仅影响解析请求的方式。它不影响响应格式。

Since Rails 5.0,响应格式通过检查:

  1. 一个 format 参数(例如 /url?format=xml
  2. HTTP Accept 标头(例如 Accept: application/json
  3. 路径扩展名(例如 /url.html

您可以在 ActionDispatch::Http::MimeNegotation#formats 的实现中看到这一点。以下是 Rails v6.1 的摘录:

if params_readable?
  Array(Mime[parameters[:format]])
elsif use_accept_header && valid_accept_header
  accepts
elsif extension_format = format_from_path_extension
  [extension_format]
elsif xhr?
  [Mime[:js]]
else
  [Mime[:html]]
end