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

使用默认路由,request / posts /:id被映射到“show”操作:format => "html" 。 我在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" ? 谢谢。

请求的默认格式:

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

search官方的Ruby on Rails路由指南总是一个好主意,对于任何路由问题来说,这都是非常深入和非常好的首选资源。

如果您只想支持一种格式并将所有请求视为该格式,则可以使用筛选器来更改它:

 before_filter :set_format def set_format request.format = 'xml' end 

Rails 5 :在你的控制器(如ApplicationController如果所有的应用程序使用相同的格式)添加以下内容:

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

对于Rails 4和更老版本,使用before_filter而不是before_action

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

 { format: :json } 

在你的config/routes.rb即使你的accept头文件中没有设置JSON,它仍然强制请求到一个JSON请求,包括控制器testing,其中包含as: :html选项。 这对我来说并不是什么大事,所以我不打算深究这是为什么,但如果有人知道,让我知道,我会更新这个答案。

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

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

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

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

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