如何在Rails中设置路由的默认格式?

时间:2011-01-26 00:00:50

标签: ruby-on-rails ruby-on-rails-3

使用默认路由,request / posts /:id将映射到:format => "html"的“show”操作。我在show动作中使用了一些xhtml元素,除非将: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 个答案:

答案 0 :(得分:83)

请求的默认格式:

您可以使用默认哈希值将给定路由的默认格式设置为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' }

搜索official Ruby on Rails routing guide总是一个好主意,它是相当深入的,也是任何路由问题的非常好的第一站资源。

答案 1 :(得分:20)

如果您只想支持一种格式并将所有请求视为该格式,则可以使用过滤器进行更改:

before_filter :set_format

def set_format
  request.format = 'xml'
end

答案 2 :(得分:9)

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_action

答案 3 :(得分:3)

如果你使用它,我在Rails 5中发现了奇怪的行为:

{ format: :json }

config/routes.rb中,即使未在接受标头中设置JSON,它仍会强制请求JSON请求,包括设置了as: :html选项的控制器测试。这对我来说并不是什么大不了的事情,所以我不会深入研究为什么会这样,但如果有人弄明白,请告诉我,我会更新这个答案。

答案 4 :(得分:2)

如果要设置路线的默认格式,请使用defaults选项:

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

但是,如果您要强制执行每个请求以返回特定格式,请使用constraints选项:

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

请参阅文档:http://edgeguides.rubyonrails.org/routing.html#request-based-constraints