Rails: как лечить альтернативу Accept: content-types as JSON?

До сих пор я нашел два способа для request.format.json? быть истинным в Rails (т.е. когда входящий запрос обрабатывается как JSON). Один из них заключается в том, что если вы запрашиваете ресурс и заканчиваете на .json, то другой - если вы указываете заголовок Accept: application/json в своем запросе. Каждая работа автономна.

Я хочу зарегистрировать свой собственный тип "accepts" для этого второго случая:

Accept: application/vnd.myapp_v1+json, и это обработано рельсами как "запрос json", например application/json, без необходимости добавления .json.

Моя первая мысль заключалась в регистрации моего MimeType как :json (в моем инициализационном коде), но это фактически нарушит поддержку приложения /json, а не то, что я хочу сделать.

    Mime::Type.register "application/vnd.myapp_v1+json", :json  # my failed attempt

Ответ 1

Мы пересылаем запросы iPhone на HTML в нашем приложении с помощью before_filter:

before_filter :determine_format

def determine_format
    request.format = :iphone if (request.env["HTTP_USER_AGENT"] =~ /iPhone/ && request.format == :html)
end

Я предполагаю, что вы можете сделать что-то подобное в своем конкретном формате, может быть, вот так:

def determine_format
    request.format = :json if (request.format == 'application/vnd.myapp_v1+json')
end

Ответ 2

Альтернативой этому является:

api_mime_types = %W(
  application/vnd.api+json
  text/x-json
  application/json
)

Mime::Type.unregister :json
Mime::Type.register 'application/json', :json, api_mime_types

В initializers/mime_types.rb.