Ist es möglich, einen variablen Namespace zu haben? Ich habe erholsame Ressourcen wie folgt aus:Rails 3 Routing-Ressourcen mit Variablen-Namespace
resources :articles
resources :persons
Aber ich brauche diese in einem variablen Namensraum zu Umfang, so dass sie auf URLs der Form reagiert:
':edition/:controller/:action/:id'
zum Beispiel:
/foobar/article/edit/123
oder /bazbam/person/edit/345
für jede der Ressourcen. Ist das mit der resources
Methode möglich, oder muss ich diese von Hand herstellen? Ich werde nicht die möglichen Werte für im Voraus wissen; diese werden in meiner in einem before_filter
nachgeschlagen.
Ist das alles, was ich tun muss?
scope ':edition' do
resources :articles
resources :matches
resources :teams
end
UPDATE: Wenn der Anwendungsbereich der Richtlinie über Verwendung, ich Routen wie ich will:
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"}
Ich bin jetzt in der Lage zu verweisen :edition
in meinem 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
Jetzt möchte ich nur sicherstellen, dass dies der beste Weg ist, dies zu erreichen.
Aber was löst params [: edition]? Ist es ernsthaft Foobar oder Bazbam? Wenn ja, dann gewinne! Ich habe etwas gelernt! – Cory
Das 'scope ': edition'' funktioniert wirklich! Aber in URL-Helfern häufen sich viele Probleme, zB: 'link_to (" View Article ", @article)', 'form_for (@article)' und 'redirect_to (@article)' würden den Fehler auslösen. Ich denke, der Gestaltungszweck von 'scope' ist für statische Namespaces. Warum füge ich die Ausgabe nicht einfach als URL an das Ende der URL an? Es würde Ihre Zeit sparen, wenn Sie den Schienen folgen. – Kevin
@Kevin - Ich möchte wirklich die URLs RESTful, und in meinem Fall ist jede Ressource in der Tat einzigartig in Bezug auf: Edition, so dass dies nicht die Absicht von REST kontrahiert. Das Übergeben als Param könnte funktionieren, aber ich wollte die URLs so human wie möglich halten. Eine andere Option wäre, dem Benutzer zu ermöglichen, über ein Dropdown-Menü in der Datei application.html.erb die Editionen zu wechseln und diesen Wert in einem Cookie zu speichern. –