2009-08-19 10 views
8

Ist es möglich, eine Sub-Domain zu einer Ressource zuzuordnen? Ich habe ein Firmenmodell. Derzeit verwenden subdomain_fu, meine Routing-Datei enthält:Rails: Routing Sub-Domain zu einer Ressource

map.company_root '', :controller => 'companies', :action => 'show', 
         :conditions => { :subdomain => /.+/ } 

My Company Modell enthält eine "Sub-Domain" Spalte.

Während dies wie vorgesehen funktioniert, ist es eine benannte Route und ist nicht erholsam. Im Wesentlichen muss ich "name.domain.com" der show-Aktion für den Unternehmenscontroller zuordnen. Ist eine benannte Route der richtige Weg oder kann ich eine Ressourcenroute verwenden?

Antwort

4

Ich kenne keine Möglichkeit, dies mit map.resources zu tun. Es akzeptiert eine Option :conditions Option, aber ich bin mir nicht sicher, wie Sie den /companies/ Teil der URL entfernen. map.resources ist jedoch in erster Linie eine bequeme Möglichkeit, eine Reihe von benannten Routen zu generieren, die Sie manuell ausführen können. Etwas wie das.

map.company '', :controller => 'companies', :action => 'show', :conditions => { :subdomain => /.+/, :method => :get } 
map.new_company 'new', :controller => 'companies', :action => 'new', :conditions => { :subdomain => /.+/, :method => :get } 
map.edit_company 'edit', :controller => 'companies', :action => 'edit', :conditions => { :subdomain => /.+/, :method => :get } 
map.connect '', :controller => 'companies', :action => 'create', :conditions => { :subdomain => /.+/, :method => :post } 
map.connect '', :controller => 'companies', :action => 'update', :conditions => { :subdomain => /.+/, :method => :put } 
map.connect '', :controller => 'companies', :action => 'destroy', :conditions => { :subdomain => /.+/, :method => :delete } 

Nicht getestet, aber es sollte Ihnen nahe kommen.

+0

Dank Ryan! Was ich getan habe, ist die Firma-Ressource in einem Namespace zu platzieren. Dies ermöglicht den Zugriff auf die neuen Aktionen "Bearbeiten", "Erstellen", "Aktualisieren" und "Löschen" ohne Subdomäne: i.e. domain.com/namespace/companies/action Dann, außerhalb des Namespace, verwende ich diese map.company benannte Route (wenn eine Subdomain vorhanden ist). Alles scheint gut zu kartieren. – Homar

8

Man kann Bedingungen an eine Ressourcenroute sowie eine benannte Route übergeben. In einer Anwendung, die ich mit allem zu tun habe, wird auf ein Konto verwiesen. A: before_filter lädt das Konto mit der Subdomain. Für Ressourcen, die auf ein Konto beschränkt sind, möchten wir die Routen auf URLs mit Subdomains beschränken. Die trockene Art und Weise, dies zu tun ist Karte mit Optionen zu verwenden:

map.with_options :conditions => {:subdomain => /.+/} do |site| 
    site.resources :user_sessions, :only => [:new, :create, :destroy] 
    site.resources :users 
    site.login 'login', :controller => "user_sessions", :action => "new" 
    site.logout 'logout', :controller => "user_sessions", :action => "destroy" 
    … 
    end 

    map.connect 'accounts/new/:plan', :controller => "accounts", :action => "new" 
    map.resources :accounts, :only => [:new, :create] 

Wie Sie eine benannte Route zu einem Bedingung Hash mit einer Sub-Domain akzeptiert sehen. Sie können annehmen auch den Ansatz Ryan oben dargestellt, oder Sie können Bedingungen auf einer Pro-Ressourcenbasis angeben:

map.resources :users, :conditions => {:subdomain => /.+/} 
2

Hier ist eine komplette Beispielimplementierung von Rails 3 subdomains mit Authentifizierung (zusammen mit einer detaillierten Anleitung). In Rails 3 ist das viel einfacher als in Rails 2 (kein Plugin erforderlich).

+0

Danke für den Tipp. Deep Link zum Beispiel routes.rb ist: https://github.com/fortituity/rails3-subdomain-devise/blob/master/config/routes.rb –

2

Mit der Ressource von Daniel Antwort verknüpft, in Rails 3 der Weg zur Route '/' zu einem anderen Controller auf der Sub-Domäne abhängig ist wie folgt:

match '/' => 'somecontroller#action', :constraints => { :subdomain => 'yoursubdomain' }