2009-08-19 9 views
8

Czy można zmapować subdomenę do zasobu? Mam model firmy. Obecnie za pomocą subdomain_fu mój plik routingu zawiera:Szyny: Routing subdomeny do zasobu

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

Model mojej firmy zawiera kolumnę "subdomeny".

Chociaż działa to zgodnie z przeznaczeniem, jest to nazwana trasa i nie jest spokojny. Zasadniczo muszę mapować "name.domain.com" do akcji pokazu dla kontrolera firm. Czy wyznaczona trasa jest do zrobienia, czy mogę użyć trasy zasobów?

Odpowiedz

4

Nie wiem, jak to zrobić z map.resources. Przyjmuje opcję :conditions, ale nie jestem pewien, jak usunąć część adresu URL z /companies/. Jednakże, map.resources jest przede wszystkim wygodnym sposobem generowania paczki nazwanych tras, które można wykonać ręcznie. Coś takiego.

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 } 

Niewygodne, ale powinno Cię do siebie zbliżyć.

+0

Dzięki Ryan! To, co zrobiłem, to umieszczenie zasobów firmowych w przestrzeni nazw. Pozwala to na dostęp do nowych, edytowanych, tworzonych, aktualizowanych i niszczących działań bez subdomeny: tj. domain.com/namespace/companies/action Następnie, poza przestrzenią nazw, używam tej mapy.firma o nazwie route (kiedy subdomena jest obecna). Wszystko wydaje się ładnie mapować. – Homar

8

Można przekazać warunki do trasy zasobu, a także określonej trasy. W aplikacji, w której jestem zaangażowany, wszystko jest ograniczone do konta. Odp .: before_filter ładuje konto przy użyciu subdomeny. Tak więc w przypadku zasobów z zakresem, chcemy rozszerzyć zakres tras na adresy URL z subdomenami. Sucha sposobem, aby to zrobić jest użycie mapę z opcji:

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] 

Jak widać nazwany trasa będzie akceptować z subdomeny zbyt się warunki mieszania. Można również przyjąć podejście Ryan zilustrowaną powyżej lub można określić warunki na podstawie zasobu za:

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

Oto kompletny przykładową implementację Rails 3 subdomains z uwierzytelnianiem (wraz ze szczegółowym tutorialu). W Rails 3 jest to o wiele łatwiejsze niż w Rails 2 (nie jest wymagana żadna wtyczka).

+0

Dzięki za cynk. Głęboki link do przykładu routes.rb to: https://github.com/fortuity/rails3-subdomain-devise/blob/master/config/routes.rb –

2

Korzystanie zasób powiązany z odpowiedzią Daniela, w Rails 3 Sposobem na trasie „/” do innego kontrolera w zależności od subdomeny jest następujący:

match '/' => 'somecontroller#action', :constraints => { :subdomain => 'yoursubdomain' } 
Powiązane problemy