Question: I'm just wondering how rails knows the format of the request as to correctly enter in the famous: 

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

```

As an example consider this situation I have faced up. Suppose that via javascript (using jQuery) I make a POST request expliciting **dataType: json**

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

```

When this request reach controller action, standing inside it with ruby debugger, I inspect @request.format and I can see that content-type is application/json. Then the controller respond to json format as expected. 

But I'm confused with the format symbol especified in the routes. Suppose that a request is made to **example.com/parts.json** but in the request the content type is application/html or application/xml. **Is the controller responding to json format or html or xml??**

Thanks!

Answer: 
From [ActionController::MimeResponds](https://github.com/rails/rails/blob/bbf0d35bf6148752911c1da4b7449450faea8755/actionpack/lib/action_controller/metal/mime_responds.rb#L25): "Rails determines the desired response format from the HTTP Accept header submitted by the client."
The incoming `Content-Type` only affects the way the request is parsed. It doesn't affect the response format.

[Since Rails 5.0](https://github.com/rails/rails/commit/44ca804229cfdf7a149eed63a2f61f387f6f9fc8), the response format is determined by checking for:

1. A `format` parameter (e.g. `/url?format=xml`)
2. The HTTP `Accept` header (e.g. `Accept: application/json`)
3. The path extension (e.g. `/url.html`)

You can see this in the implementation of [`ActionDispatch::Http::MimeNegotation#formats`](https://github.com/rails/rails/blob/v6.1.4/actionpack/lib/action_dispatch/http/mime_negotiation.rb#L69). Here is an excerpt from Rails v6.1:

```rb
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

```