2010-01-15 5 views
5

Ich entwickle eine Rails-App, die standardmäßig Benutzerkonten zu einer Sub-Domain ihrer Wahl einrichtet. Als Option können sie ihre eigene vollständige Domain ihrem Konto zuordnen.Wie wird eine vollständige Domäne einem Subdomänen-basierten Rails App-Konto zugeordnet?

So weit habe ich die Dinge eingerichtet. Ich verwende subdomain-fu, um die Routing-Leistung:

# 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 

Zusätzlich zu, dass ich die method described here bin mit dem Konto zu erhalten, auf die zugegriffen, über Sub-Domain oder vollständige Domain:

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 

Ich habe nicht Ich bin sehr weit in den Prozess gekommen, dies zu bauen, aber schon jetzt kann ich sehen, dass ich Probleme mit dem Routing bekommen werde. Wenn request.host eine random.com-Domain ist, wird subdomain-fu nicht die entsprechenden Routen routen?

Ich nehme an, das ist nicht so ungewöhnlich ein Problem, so kann jeder teilen, wie sie dieses Problem angepackt haben, oder wie ich meine Routen konfigurieren würde, um zu tun, was ich brauche?

Antwort

2

Ich stieß auf dieses Problem und versuchte, zu viel in einer einzigen Anwendung zu tun. Du wirst anfangen, Conditionals in sehr seltsamen Orten zu machen, die du nicht tun solltest. Ich entschied mich, 2 separate Rails-Apps zu haben, die den Wildcard-Domain-Punkt auf die Anwendung des Benutzers haben und dann www.domain.com und domain.com auf die öffentlich zugängliche Seite zeigen. Ich weiß, dass das deine Frage nicht direkt "beantwortet".

Kleiner Code Geruch dort, dass ich Ihnen helfen kann, zu beheben, wenn Sie die von dieser Methode nach oben hinzufügen:

return @current_club if defined?(@current_club) 

Es wird nicht eine Abfrage für jedes Mal, wenn Sie @current_club zugreifen versuchen, macht ihm gibt das Ergebnis zurück, das Sie bereits zurückgegeben haben.

+0

Vielen Dank für Ihre Antwort. Nachdem ich mit der hier veröffentlichten Lösung experimentiert habe, bin ich zu dem Schluss gekommen, dass Sie Recht haben und aus Gründen der Einfachheit das Beste darin ist, es in zwei Apps aufzuteilen und Subdomain-Fu zu beseitigen. – aaronrussell

3

Sie können eine Rack-Middleware schreiben, die die Domäne in die Subdomäne konvertiert, bevor sie die Rails-Anwendung erreicht.

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 

Dann fügen Sie das in environment.rb:

config.middleware.use AccountDetector 
+0

Vielen Dank. Ich mochte diese Antwort, also auch einige Tests. Ihr Middleware-Skript funktioniert gut, aber leider hatte es bei Sitzungen (mit Authlogic) einige seltsame Anklopf-Effekte. Ich habe mich - widerwillig - entschieden, die App in zwei separate Apps aufzuteilen. – aaronrussell

Verwandte Themen