Как установить формат по умолчанию для маршрута в Rails? - PullRequest
38 голосов
/ 26 января 2011

При маршрутизации по умолчанию запрос / posts /: id сопоставляется с действием "show" с помощью :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"?Спасибо.

Ответы [ 5 ]

83 голосов
/ 26 января 2011

Формат по умолчанию для запросов:

Вы можете установить формат по умолчанию для данного маршрута в 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 , это достаточно детальное и очень хорошее первоочередное решение для любых проблем с маршрутизацией.

20 голосов
/ 26 января 2011

Если вы хотите поддерживать только один формат и обрабатывать все запросы как этот формат, вы можете использовать фильтр для его изменения:

before_filter :set_format

def set_format
  request.format = 'xml'
end
10 голосов
/ 04 января 2017

Rails 4 и 5 : В вашем контроллере (например, ApplicationController, если все приложение использует один и тот же формат) добавьте следующее:

  before_action :set_default_request_format

  def set_default_request_format
    request.format = :json unless params[:format]
  end

Для Рельсы 3 и старше используйте before_filter вместо before_action.

3 голосов
/ 24 июля 2017

Я нахожу странное поведение в Rails 5, если вы используете это:

{ format: :json }

В вашем config/routes.rb тогда, даже если JSON не установлен в вашем заголовке accept, он все равно приводит запрос к JSON-запросу, в том числе для тестов контроллера, у которых установлена ​​опция as: :html. Для меня это не имеет большого значения, поэтому я не буду разбираться, почему это так, но если кто-то это выяснит, дайте мне знать, и я обновлю этот ответ.

2 голосов
/ 19 ноября 2017

Если вы хотите установить формат маршрута по умолчанию, используйте параметр defaults:

resources :posts, defaults: { format: 'xml' }

Но если вы хотите, чтобы каждый запрос возвращал определенный формат, используйте параметр constraints:

resources :posts, constraints: lambda { |req| req.format == 'xml' }

См. Документацию: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...