Rails: маршрутизация субдомена к ресурсу - PullRequest
8 голосов
/ 19 августа 2009

Можно ли сопоставить поддомен с ресурсом? У меня есть модель компании. В настоящее время, используя subdomain_fu, мой файл маршрутизации содержит:

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

Модель моей компании содержит столбец "поддомен".

Хотя это работает как задумано, это именованный маршрут, и он не успокаивает. По сути, мне нужно сопоставить «name.domain.com» с действием show для контроллера компании. Является ли именованный маршрут способом, или я могу использовать ресурсный маршрут?

Ответы [ 4 ]

8 голосов
/ 02 декабря 2009

Можно передавать условия как для маршрута ресурса, так и для именованного маршрута. В приложении, которое я участвую, все относится к учетной записи. A: before_filter загружает учетную запись, используя поддомен. Таким образом, для ресурсов, ограниченных учетной записью, мы хотим ограничить маршруты до URL с помощью поддоменов. СУХОЙ способ сделать это - использовать карту с параметрами:

  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]

Как видите, именованный маршрут будет принимать хэш условий с поддоменом. Вы также можете принять подход Райана, показанный выше, или указать условия для каждого ресурса:

  map.resources :users, :conditions => {:subdomain => /.+/}
4 голосов
/ 19 августа 2009

Я не знаю, как это сделать с map.resources. Он принимает параметр :conditions, но я не уверен, как удалить часть URL /companies/. Тем не менее, map.resources - это прежде всего удобный способ создания группы именованных маршрутов, что можно сделать вручную. Как то так.

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 }

Не проверено, но это должно приблизить вас.

2 голосов
/ 09 августа 2011

Используя ресурс, связанный с ответом Даниэля, в Rails 3 способ маршрутизации '/' на другой контроллер в зависимости от субдомена выглядит следующим образом:

match '/' => 'somecontroller#action', :constraints => { :subdomain => 'yoursubdomain' }
2 голосов
/ 08 сентября 2010

Вот полный пример реализации Rails 3 поддоменов с аутентификацией (вместе с подробным руководством). Это гораздо проще сделать в Rails 3, чем в Rails 2 (плагин не требуется).

...