2009-08-19 13 views
8

È possibile mappare un sottodominio a una risorsa? Ho un modello aziendale. Attualmente, utilizzando subdomain_fu, il mio file di routing contiene:Rails: sottodominio di routing a una risorsa

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

Il mio modello società contiene una colonna "sottodominio".

Mentre funziona come previsto, è una route denominata e non è riposante. Essenzialmente, ho bisogno di mappare "name.domain.com" all'azione show per il controller delle aziende. La rotta indicata è la strada da percorrere, oppure posso utilizzare una rotta di risorsa?

risposta

4

Non conosco un modo per farlo con map.resources. Accetta un'opzione :conditions ma non sono sicuro di come rimuovere la parte /companies/ dell'URL. Tuttavia, map.resources è principalmente un modo conveniente per generare una serie di percorsi denominati, che è possibile eseguire manualmente. Qualcosa come questo.

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 } 

Non testato, ma dovrebbe farti chiudere.

+0

Grazie Ryan! Quello che ho fatto è posizionare la risorsa delle aziende in uno spazio dei nomi. Ciò consente l'accesso alle nuove azioni, modifica, creazione, aggiornamento e distruzione senza un sottodominio: I.e. domain.com/namespace/companies/action Quindi, al di fuori dello spazio dei nomi, sto usando quella rotta denominata map.company (quando è presente un sottodominio). Tutto sembra essere mappato bene. – Homar

8

Si possono passare le condizioni a una rotta di risorsa e una rotta denominata. In un'applicazione in cui sono coinvolto, tutto è associato a un account. A: before_filter carica l'account usando il sottodominio. Pertanto, per le risorse con scope per un account, vogliamo impostare i percorsi su URL con sottodomini. Il modo DRY per farlo è quello di utilizzare carta con le opzioni:

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] 

Come si può vedere un percorso di nome accetterà un hash condizioni con un sottodominio troppo. È anche possibile adottare l'approccio Ryan illustrato sopra o è possibile specificare le condizioni in base al risorsa:

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

Ecco un esempio di implementazione completa di Rails 3 subdomains con l'autenticazione (con un tutorial dettagliato). È molto più facile farlo in Rails 3 che in Rails 2 (non è richiesto alcun plugin).

+0

Grazie per il suggerimento. Il deep link all'esempio routes.rb è: https://github.com/fortuity/rails3-subdomain-devise/blob/master/config/routes.rb –

2

Utilizzando la risorsa collegata dalla risposta di Daniel, in Rails 3 il modo per percorso '/' a un controller diverso a seconda del sottodominio è la seguente:

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