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.
Mais à quoi sert params [: edition]? Est-ce sérieusement foobar ou bazbam? Si oui, gagnez! J'ai appris quelque chose! – Cory
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
@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. –