Как установить формат по умолчанию для маршрута в Rails?
При маршрутизации по умолчанию идентификатор request/posts/: id отображается в действие "показать" с помощью :format => "html"
. Я использую некоторые элементы xhtml в моем действии show, которые не отображаются правильно, если только: content_type не установлен в xml. В настоящее время я обойду это, создав show.xml.erb и установив content_type вручную следующим образом:
format.html { render :template => "/posts/show.xml.erb",
:locals => {:post => @post}, :content_type => "text/xml" }
Это кажется глупым. Как изменить routes.rb
так, чтобы /posts/: id маршрутизировался с помощью format=>"xml"
? Спасибо.
Ответы
Ответ 1
Формат по умолчанию для запросов:
Вы можете установить формат по умолчанию для заданного маршрута в xml с использованием хэша по умолчанию.
Примеры:
# single match defaulting to XML (/plots/1 is the same as /plots/1.xml)
match 'posts/:id' => 'posts#show', :defaults => { :format => 'xml' }
# using resources, defaulting to XML (all action use XML by default)
resources :posts, :defaults => { :format => 'xml' }
# using resources and mixing with other options
resources :posts,
:only => [:new, :create, :destroy],
:defaults => { :format => 'xml' }
Всегда полезно искать официальное руководство по маршрутизации Ruby on Rails, оно довольно глубокое и очень хороший ресурс первой остановки для любых проблем маршрутизации.
Ответ 2
Если вы хотите поддерживать только один формат и рассматривать все запросы как этот формат, вы можете использовать фильтр для его изменения:
before_filter :set_format
def set_format
request.format = 'xml'
end
Ответ 3
Rails 4 и 5: В вашем контроллере (например, ApplicationController
если все приложение использует один и тот же формат) добавьте следующее:
before_action :set_default_request_format
def set_default_request_format
request.format = :json unless params[:format]
end
Для Rails 3 и более ранних before_filter
используйте before_filter
вместо before_action
.
Ответ 4
Я нахожу странное поведение в Rails 5, если вы это используете:
{ format: :json }
В вашем config/routes.rb
, даже если JSON не установлен в заголовке accept, он по-прежнему принуждает запрос к запросу JSON, в том числе для тестов контроллера, которые имеют параметр as: :html
. Для меня это не очень важно, поэтому я не собираюсь вникать в то, почему это так, но если кто-то это выяснит, дайте мне знать, и я обновлю этот ответ.
Ответ 5
Если вы хотите установить формат маршрута по defaults
, используйте опцию по defaults
:
resources :posts, defaults: { format: 'xml' }
Но если вы хотите, чтобы каждый запрос возвращал определенный формат, используйте параметр constraints
:
resources :posts, constraints: lambda { |req| req.format == 'xml' }
Смотрите документацию: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints