2010-03-07 101 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 == ...某事...然后渲染这个或其他视图。

相关问题