2011-01-26 123 views
34

使用默认路由,请求/ posts /:id被映射到:format => "html"的“show”操作。我在我的show动作中使用了一些xhtml元素,除非:content_type被设置为xml,否则无法正确呈现。我目前得到解决此通过渲染show.xml.erb和手动设置的CONTENT_TYPE如下:如何在Rails中设置路线的默认格式?

format.html { render :template => "/posts/show.xml.erb", 
      :locals => {:post => @post}, :content_type => "text/xml" } 

这似乎是愚蠢的,但。我如何更改routes.rb以便/ posts /:id与format=>"xml"路由?谢谢。

+0

您的问题对模型感到困惑:您有地块或帖子吗? – tomeduarte

+0

哎呀,对不起。它的一个模型,称它为帖子。 – Saucerful

回答

76

请求的默认格式:

可以设置使用默认散列的给定路由的默认格式为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一个好主意,这是相当深入,任何路由问题一个很好的第一站资源。

+9

你也可以设置命名空间的默认格式,例如: 'namespace:user,:defaults => {:format =>'json'}' –

+0

太棒了。如果没有上述格式设置,即使控制器中的其他任何内容都很酷,我也会收到406个请求xml的错误。 – Polsonby

19

如果你只是想支持一种格式,并把所有的请求作为该格式,你可以使用过滤器来改变它:

before_filter :set_format 

def set_format 
    request.format = 'xml' 
end 
+0

此代码是否在控制器中? – Saucerful

+1

是的。如果您选择使用此解决方案而不是路由方式(请参阅我的答案),则应根据安全性考虑将过滤器设置为私有方法。 - 请注意,这会强制格式作为路由方式不能使用的地方,只是设置默认值。 – tomeduarte

6

导轨5:在你的控制器(如果所有整个应用程序使用相同的格式例如ApplicationController)添加下列:

before_action :set_default_request_format 

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

对于导轨4和老年人使用before_filter代替before_action

2

我发现在Rails的5怪异的行为,如果你使用:

{ format: :json } 

在你config/routes.rb那么即使JSON是不是在你的接受头设置,它仍然强制转换的请求JSON请求,包括用于设置了as: :html选项的控制器测试。这对我来说并不是什么大问题,所以我不会深究为什么会出现这种情况,但如果有人将其解决,请告诉我,我会更新此答案。

+0

我看到同样的事情。很烦人。 – turboladen

0

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

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

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

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

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