如何在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