2010-03-07 2 views
0

La question suivante concerne la transmission d'une variable des routes au contrôleur. J'ai une application Ruby on Rails (v 2.3.3) avec un modèle, qui est livré à l'utilisateur avec plusieurs vues. La solution actuelle implique l'utilisation de plusieurs contrôleurs qui sont déclenchés par plusieurs routes. Par exemple:Transmission de variables au contrôleur via le routage RESTful dans Rails

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 

Cependant, pour le bien de la sécheresse, je voudrais que ces routes pour fonctionner avec le même contrôleur. Pour que le contrôleur soit distinct entre les routes, je voudrais passer une variable par l'itinéraire. Par exemple:

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 

Ainsi, dans le contrôleur que je pouvais faire ceci:

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 

J'ai trouvé un moyen de le faire avec le routage non-RESTful (map.with_options etc.), mais je préférez utiliser des routes RESTful avec map.resource (s). Une solution laide pourrait être d'analyser l'URI de la demande dans le contrôleur, ce que je ne préfère pas.

Répondre

1

Puisqu'il n'y a aucune réponse et j'ai trouvé une solution, je vais répondre moi-même à cette question. Si vous avez également une situation où vous pourriez avoir un modèle ou une table, qui a plusieurs entrées, mais pour certaines d'entre elles, vous pourriez avoir besoin de vues séparées, cela pourrait vous être utile.

Très probablement, vous aimeriez avoir différents indices et pour cela il suffit d'utiliser la collection get:

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

Ajoutez simplement les méthodes nommées « simpsons » et « Pierrafeu » dans votre contrôleur. Et, pour les méthodes d'édition, d'affichage et de suppression, vous pouvez utiliser un peu de logique supplémentaire, si nécessaire, en déterminant l'ID de l'entrée à portée de main. Quelque chose comme @episode = Episode.find (params [: id]), si @ episode.criteria == ... quelque chose ... puis affichez ceci ou l'autre vue.

Questions connexes