2010-03-07 99 views
0

以下問題與將路由變量傳遞給控制器​​有關。我有一個模型的Ruby on Rails(v 2.3.3)應用程序,該模型通過多個視圖交付給用戶。目前的解決方案涉及使用由多條路線觸發的多個控制器。例如:在Rails中通過RESTful路由將變量傳遞給控制器​​

ActionController::Routing::Routes.draw do |map| # defines map 

map.resource :simpsons, :only => [] do |b| 
    b.resources :episodes, :controller => "SimpsonsEpisodes" 
end 
map.resource :flintstones, :only => [] do |b| 
    b.resources :episodes, :controller => "FlintstonesEpisodes" 
end 

但是,爲了乾燥,我希望這些路線使用相同的控制器。爲了讓控制器區分不同的路線,我想通過路線傳遞一個變量。例如:

map.resource :simpsons, :only => [] do |b| 
    b.resources :episodes, :controller => "Episodes", :type => "simpsons" 
end 
map.resource :flintstones, :only => [] do |b| 
    b.resources :episodes, :controller => "Episodes", :type => "flintstones" 
end 

所以在控制器我可以這樣做:

case(type) 
when "simpsons" then ... do something for the Simpsons ... 
when "flintstones" then ... do something for the Simpsons ... 
else  .... do something for all episodes .... 
end 

我找到了一種與非RESTful路由(map.with_options等),要做到這一點,但我寧願使用map.resource(s)使用RESTful路由。一個醜陋的解決方案可能是解析控制器中的請求URI,這是我不喜歡的。

回答

1

由於沒有回覆,我找到了解決方案,我將自己回答這個問題。如果您還有一種情況,那麼您可能有一個模型或一個表格,其中有多個條目,但對於其中的一些,您可能需要單獨的視圖,這可能會對您有所幫助。

最有可能你想有不同的指標,對於簡單的使用collection來:

map.resources :episodes, :collection => {:simpsons=> :get, :flintstones=> :get} do |episode| 
....and so on 

只需添加一個名爲在控制器「辛普森一家」和「摩登原始人」的方法。而且,對於編輯,查看和刪除方法,您可以使用一些額外的邏輯,如有必要,可以通過確定當前條目的ID。類似@episode = Episode.find(params [:id]),如果@ episode.criteria == ...某事...然後渲染這個或其他視圖。

相關問題