2009-08-19 13 views
8

¿Es posible asignar un subdominio a un recurso? Tengo un modelo de empresa. Actualmente, el uso de subdomain_fu, mi archivo de enrutamiento contiene:Rieles: subdominio de enrutamiento a un recurso

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

Mi modelo de empresa contiene una columna "subdominio".

Si bien esto funciona según lo previsto, es una ruta con nombre y no es relajante. Básicamente, necesito asignar "nombre.dominio.com" a la acción de mostrar para el controlador de la empresa. ¿Es una ruta con nombre el camino a seguir, o puedo usar una ruta de recursos?

Respuesta

4

No sé de una manera de hacer esto con map.resources. Acepta una opción :conditions, pero no estoy seguro de cómo eliminar la parte /companies/ de la URL. Sin embargo, map.resources es principalmente una forma conveniente de generar un grupo de rutas con nombre, que puede hacer manualmente. Algo como esto.

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 } 

No probado, pero debe llegarle cerca.

+0

Gracias Ryan! Lo que hice fue colocar el recurso de las compañías debajo de un espacio de nombres. Esto permite acceder a las acciones nuevas, editar, crear, actualizar y destruir sin un subdominio: es decir, domain.com/namespace/companies/action Luego, fuera del espacio de nombres, estoy usando esa ruta nombrada map.company (cuando hay un subdominio presente). Todo parece estar mapeando bien. – Homar

8

Se pueden pasar condiciones a una ruta de recurso, así como a una ruta con nombre. En una aplicación, estoy involucrado con todo lo que tiene un alcance en una cuenta. A: before_filter carga la cuenta usando el subdominio. Por lo tanto, para los recursos ubicados en una cuenta, queremos delimitar las rutas a las URL con subdominios. La vía seca para hacer esto es utilizar un mapa con las opciones:

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] 

Como se puede ver una ruta denominada aceptará un hash condiciones con un subdominio también. También puede adoptar el enfoque de Ryan ha ilustrado anteriormente o puede especificar las condiciones en función de cada recurso:

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

Aquí está un ejemplo de implementación completa de Rails 3 subdomains con autenticación (junto con un tutorial detallado). Es mucho más fácil hacer esto en Rails 3 que en Rails 2 (no se requiere ningún complemento).

+0

Gracias por la sugerencia. El enlace profundo al ejemplo routes.rb es: https://github.com/fortuity/rails3-subdomain-devise/blob/master/config/routes.rb –

2

Utilizando el recurso vinculado a la respuesta de Daniel, en Rails 3 la manera de ruta '/' a un controlador diferente en función del subdominio es el siguiente:

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