2010-01-15 29 views
5

Estoy desarrollando una aplicación de Rails que configura de manera predeterminada las cuentas de usuario en un subdominio de su elección. Como una opción, podrán asignar su propio dominio completo a su cuenta.¿Cómo asignar un dominio completo a una cuenta de la aplicación Rails basada en subdominios?

Hasta ahora, así es como tengo todo configurado. Estoy usando subdomain-fu para alimentar el enrutamiento:

# routes.rb 
map.with_options :conditions => {:subdomain => true} do |app| 
    app.resources # User's application routes are all mapped here 
end 

map.with_options :conditions => {:subdomain => false} do |www| 
    www.resources # Public-facing sales website routes are mapped here 
end 

Además de eso, estoy usando el method described here para obtener la cuenta que se accede, a través de subdominio o dominio completo:

before_filter :set_current_account 

def set_current_account 
    if request.host.ends_with? current_domain 
    # via subdomain 
    @current_club = Club.find_by_subdomain(current_subdomain) 
    else 
    # via full domain 
    @current_club = Club.find_by_mapped_domain(request.host) 
    end 
end 

yo no tengo Llegué muy lejos en el proceso de construir esto todavía, pero ya puedo ver que voy a tener problemas con el enrutamiento. Si request.host es un dominio random.com, ¿entonces subdomain-fu no va a enrutar las rutas apropiadas?

Supongo que esto no es un problema inusual, así que ¿alguien puede compartir cómo han abordado este problema, o cómo configuraría mis rutas para hacer lo que necesito?

Respuesta

2

Me encontré con este problema, tratando de hacer demasiado en una sola aplicación. Comenzarás haciendo condicionales en lugares muy extraños que no deberías tener que hacer. Decidí tener 2 aplicaciones de Rails separadas que tienen el dominio de comodín apuntando a la aplicación del usuario, luego tener www.domain.com y domain.com apuntando al lado del público. Sé que esto no termina de "responder" a tu pregunta directamente.

olor pequeño código que hay que puedo ayudarle a reparar, si se agrega esto a la parte superior de dicho método:

return @current_club if defined?(@current_club) 

No va a hacer una consulta para cada vez que intente acceder @current_club, se devolverá el resultado que ya devolvió.

+0

Gracias por su respuesta. Después de experimentar con la otra solución publicada aquí, he llegado a la conclusión de que tienes razón y, para simplificar, lo mejor es dividirla en dos aplicaciones y eliminar el subdominio-fu. – aaronrussell

3

Puede escribir un middleware Rack que convierta el dominio en el subdominio antes de que llegue a la aplicación Rails.

class AccountDetector 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    account = Club.find_by_mapped_domain(env["HTTP_HOST"]) 
    if account 
     env["HTTP_HOST"] = "#{account.subdomain}.yourdomain.com" 
    end 

    @app.call(env) 
    end 
end 

A continuación, añadir que en environment.rb:

config.middleware.use AccountDetector 
+0

Gracias. Me gustó esta respuesta, así que hice algunas pruebas. Su secuencia de comandos de middleware funciona bien, pero desafortunadamente estaba teniendo algunos efectos extraños con las sesiones (usando Authlogic). He decidido, a regañadientes, dividir la aplicación en dos aplicaciones separadas. – aaronrussell

Cuestiones relacionadas