2011-01-26 69 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