Il modo migliore per farlo è quello di scrivere una libreria middleware semplice rack che riscrive le intestazioni di richiesta in modo che la tua app per i binari ottenga l'url che ti aspetti, ma dal punto di vista dell'utente l'url non cambia. In questo modo non è necessario apportare modifiche alla applicazione Rails (o il file di rotte)
Ad esempio, il lib cremagliera sarebbe riscrivere: users.example.com => example.com/users
Questo gemma dovrebbe fare esattamente questo per voi: http://github.com/jtrupiano/rack-rewrite
AGGIORNATO CON CODICE ESEMPIO
Nota: questo è rapidamente scritto, completamente testato, ma dovrebbe impostare voi sulla strada giusta. Inoltre, non ho controllato la gemma cremagliera-rewrite, che potrebbe rendere questo ancora più semplice
# 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
Ho aggiunto una taglia di 100 rep per questo - sto incontrando un dilemma simile, quindi una risposta valida sarebbe grande. – Jeriko
Quale versione di Rails? 2.xo 3? – tommasop
Nel mio caso, 2.3, anche se jeriko merita più attenzione su questo ora. – mark