2010-12-14 88 views
2

Est-il possible d'avoir un espace de noms de variable? J'ai RESTful comme suit:Rails 3 Ressources de routage avec un espace de noms de variable

resources :articles 
resources :persons 

Mais je dois portée ces l'intérieur d'un espace de noms de variable, de telle sorte qu'il répond aux URL de la forme:

':edition/:controller/:action/:id' 

par exemple:

/foobar/article/edit/123 ou /bazbam/person/edit/345

pour chacune des ressources. Est-ce possible avec la méthode resources, ou dois-je les fabriquer à la main? Je ne connaîtrai pas les valeurs possibles pour :edition à l'avance; ceux-ci obtiennent recherché dans un before_filter dans mon ApplicationController.

Est-ce tout ce que je dois faire?

scope ':edition' do 
    resources :articles 
    resources :matches 
    resources :teams 
end 

MISE À JOUR: Lorsque vous utilisez la directive cadre ci-dessus, je reçois des itinéraires comme je veux:

articles GET /:edition/articles(.:format)   {:action=>"index", :controller=>"articles"} 
      POST /:edition/articles(.:format)   {:action=>"create", :controller=>"articles"} 
new_article GET /:edition/articles/new(.:format)  {:action=>"new", :controller=>"articles"} 
edit_article GET /:edition/articles/:id/edit(.:format) {:action=>"edit", :controller=>"articles"} 
    article GET /:edition/articles/:id(.:format)  {:action=>"show", :controller=>"articles"} 
      PUT /:edition/articles/:id(.:format)  {:action=>"update", :controller=>"articles"} 
      DELETE /:edition/articles/:id(.:format)  {:action=>"destroy", :controller=>"articles"} 
    matches GET /:edition/matches(.:format)   {:action=>"index", :controller=>"matches"} 
      POST /:edition/matches(.:format)   {:action=>"create", :controller=>"matches"} 
    new_match GET /:edition/matches/new(.:format)  {:action=>"new", :controller=>"matches"} 
    edit_match GET /:edition/matches/:id/edit(.:format) {:action=>"edit", :controller=>"matches"} 
     match GET /:edition/matches/:id(.:format)  {:action=>"show", :controller=>"matches"} 
      PUT /:edition/matches/:id(.:format)  {:action=>"update", :controller=>"matches"} 
      DELETE /:edition/matches/:id(.:format)  {:action=>"destroy", :controller=>"matches"} 
     teams GET /:edition/teams(.:format)    {:action=>"index", :controller=>"teams"} 
      POST /:edition/teams(.:format)    {:action=>"create", :controller=>"teams"} 
    new_team GET /:edition/teams/new(.:format)   {:action=>"new", :controller=>"teams"} 
    edit_team GET /:edition/teams/:id/edit(.:format) {:action=>"edit", :controller=>"teams"} 
     team GET /:edition/teams/:id(.:format)   {:action=>"show", :controller=>"teams"} 
      PUT /:edition/teams/:id(.:format)   {:action=>"update", :controller=>"teams"} 
      DELETE /:edition/teams/:id(.:format)   {:action=>"destroy", :controller=>"teams"} 

Je suis maintenant en mesure de faire référence :edition dans mon ApplicationController:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    before_filter :authenticate_user! 
    before_filter :get_edition 

    def get_edition 
    @edition = Edition.first(:conditions => { :FriendlyName => params[:edition] }) 
    end 

end 

Maintenant, je veux juste m'assurer que c'est la meilleure façon d'accomplir cela.

+0

Mais à quoi sert params [: edition]? Est-ce sérieusement foobar ou bazbam? Si oui, gagnez! J'ai appris quelque chose! – Cory

+1

Le 'scope ': edition'' fonctionne vraiment! Mais beaucoup de problèmes surgissent dans les helpers de l'url, par exemple: 'link_to (" View Article ", @article)', 'form_for (@article)', et 'redirect_to (@article)' provoquerait une erreur. Je pense que le but de la conception de 'scope' est pour les espaces de noms statiques. Pourquoi ne pas simplement ajouter l'édition à la fin de l'URL en tant que param? Cela vous ferait gagner du temps si vous suiviez la voie des rails. – Kevin

+1

@Kevin - Je veux vraiment garder les URLs RESTful, et dans mon cas, chaque ressource est en effet unique en ce qui concerne: édition, donc cela ne contracte pas l'intention de REST. Passer en tant que param pourrait fonctionner, mais je voulais garder les URL aussi humaines que possible. Une autre option serait de permettre à l'utilisateur de changer d'édition via une liste déroulante dans le fichier application.html.erb et de stocker cette valeur dans un cookie. –

Répondre

0

En fait, vous pouvez juste faire ce qui suit:

my_var = "persons" 
resources my_var.to_sym 

Le Si vous ne connaissez pas les valeurs possibles pour l'édition méthode to_sym sur une chaîne, il se transforme en un symbole

0

- alors vous pouvez n'utilisez pas d'espaces de noms qui semblent avoir résolu ce problème. Cela dit, je les ferais simplement à la main - votre étui ici semble être le cas idéal pour renoncer à des ressources et aller directement à un chemin artisanal.