La mejor manera de hacerlo es escribir una biblioteca de middleware sencilla estante que reescribe las cabeceras de petición para que su aplicación de rieles obtenga la url que espera pero, desde el punto de vista del usuario, la url no cambia. De esta manera usted no tiene que hacer ningún cambio en su aplicación rieles (o el archivo de rutas)
Por ejemplo, el estante lib sería reescribir: users.example.com => example.com/users
Este gema debe hacer exactamente eso para usted: http://github.com/jtrupiano/rack-rewrite
ACTUALIZADO CON EJEMPLO dE CÓDIGO
Nota: esto está escrito de forma rápida, totalmente probado, pero se debe establecer en el camino correcto. Además, no he comprobado la gema rack de reescritura, lo que podría hacer esto aún más simple
# your rack middleware lib. stick this in you lib dir
class RewriteSubdomainToPath
def initialize(app)
@app = app
end
def call(env)
original_host = env['SERVER_NAME']
subdomain = get_subdomain(original_host)
if subdomain
new_host = get_domain(original_host)
env['PATH_INFO'] = [subdomain, env['PATH_INFO']].join('/')
env['HTTP_X_FORWARDED_HOST'] = [original_host, new_host].join(', ')
logger.info("Reroute: mapped #{original_host} => #{new_host}") if defined?(Rails.logger)
end
@app.call(env)
end
def get_subdomain
# code to find a subdomain. simple regex is probably find, but you might need to handle
# different TLD lengths for example .co.uk
# google this, there are lots of examples
end
def get_domain
# get the domain without the subdomain. same comments as above
end
end
# then in an initializer
Rails.application.config.middleware.use RewriteSubdomainToPath
He añadido una recompensa de 100 representantes a esto: me encuentro con un dilema similar, por lo que una respuesta viable sería genial. – Jeriko
¿Qué versión de Rails? 2.xo 3? – tommasop
En mi caso, 2.3, aunque jeriko merece más atención sobre esto ahora. – mark