2010-12-14 8 views
2

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.

+0

Aber was löst params [: edition]? Ist es ernsthaft Foobar oder Bazbam? Wenn ja, dann gewinne! Ich habe etwas gelernt! – Cory

+1

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

+1

@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. –

Antwort

0

Eigentlich kann man nur Folgendes tun:

my_var = "persons" 
resources my_var.to_sym 

Die to_sym Methode an einer Schnur ändert es zu einem Symbol

0

Wenn Sie nicht wissen, die möglichen Werte für Ausgabe - dann können Sie Verwenden Sie keine Namespaces, die das Problem möglicherweise gelöst haben.

Das gesagt, ich würde sie nur in Handarbeit machen - Ihr Fall scheint hier der ideale Fall zu sein, Ressourcen zu verlassen und direkt auf einen handwerklichen Weg zu gehen.