2012-06-15 16 views
5

Estoy intentando configurar Subdominios en Rails 3 por Ryan Bates screencast on subdomains. Sin embargo, no funciona para mí. Tengo la siguiente configuración:request.subdomain no se está configurando en Rails 3 durante el enrutamiento condicional

# routes.rb 
constraints(Subdomain) do 
    get 'devices' => 'devices#all' 
end 

# lib/subdomain.rb 
class Subdomain 
    def self.matches?(request) 
    # binding.pry 
    request.subdomain.present? && request.subdomain == "admin" 
    end 
end 

Cargando la url admin.localhost:3000/devices debería ruta que yo devices#all, sin embargo, obtener un error de enrutamiento Routing Error No route matches [GET] "/devices" Es evidente que mi ruta no está funcionando.

puedo configurar una sesión de depuración pry donde el comentario está por encima, y ​​es golpeado, por lo que mi limitación está trabajando, pero me da el siguiente resultado:

[1] pry(Subdomain)> request.subdomain 
=> "" 
[2] pry(Subdomain)> request.subdomains 
=> [] 
[3] pry(Subdomain)> request.host 
=> "admin.localhost" 

Así carriles no recoge el administrador porción de la url y colocándola en la variable de subdominio. Aunque podría simplemente usar el valor de host para filtrar a las rutas de administrador, me gustaría mantener las cosas limpias y correctas.

¿Cómo es que Rails no está estableciendo el valor del subdominio?


Editar

Tanto jdoe y coreyward son correctas con sus respuestas. Lo que me estaba tirando era que también estaba usando pow y xip.io para acceder al sitio y obtener el mismo error. Lo cual era extraño porque http://admin.app_name.192.168.1.68.xip.io/devices tiene un tld> 1. Lo que sucedía era que el subdominio para xip era admin.app_name.192.168.1.68, que también falla dado que las coincidencias son lógicas y no enruta.

+0

> ¿Cómo es que Rails no está configurando el valor del subdominio? Creo que todavía es Rack en ese punto. –

+0

@OscarDelBen no lo es.Se trata de ActionDispatch 'request.inspect # =>

+0

+1 para una aclaración adicional sobre Pow & Xip.io. :) – coreyward

Respuesta

9

Porque no hay un subdominio por lo que Rails lo considera.

Rails espera que proporcione una longitud Top-Level Domain (TLD) para TLD con más de 1 punto. Por ejemplo, si usted tenía bbc.co.uk lo haría pickup "BBC" como el subdominio a menos que se especifique la longitud TLD es 2, en cuyo caso el subdominio sería blanco:

request.subdomain(2) #=> "" 

Ésta es la razón por la que estamos viendo subdomains devolver una matriz vacía: los dos últimos segmentos se descartan automáticamente. Puede especificar 0 como la longitud del TLD para recuperar "admin", pero ese código se interrumpirá en la producción con un nombre de dominio real, por lo que no lo recomiendo.

Recomiendo usar un dominio como admin.yourapp.dev que se enruta a su computadora a través de localhost para que su aplicación detecte un subdominio correctamente. Simplemente edite/etc/hosts para hacerlo simplemente.

Si tiene curiosidad, here is the Rails source for the subdomain method.

+0

Gracias por la respuesta. Marqué el tuyo correcto ya que debería haber mirado la fuente para el método de subdominio antes de publicar en SO. :X –

5

Intente utilizar dirección especial: http://admin.lvh.me:3000/devices

o juego:

config.action_dispatch.tld_length = 0 

en su development.rb y reinicia la aplicación.

+0

Gracias @jdoe por la respuesta. Golpear a admin.lvh.me ayudó a aclarar las cosas en gran medida. –

+0

configuración action_dispatch_tld es una buena solución de software único. parece funcionar para mis necesidades – Kevin

Cuestiones relacionadas