Routen: Subdomain für jeden User

Hallo leute…
ich möchte gerne so routen das jeder User der ein :alias angegeben hat
über eine Subdomain erreichbar ist.

z.B. so:

http://:alias.meinedomain.de/
http://:alias.meinedomain.de/guestbook
http://:alias.meinedomain.de/guestbook/add

Wenn der User kein Alias angegeben hat sehen die Links so aus:
(dies funzt auch schon)

http://:alias.meinedomain.de/user/1
http://:alias.meinedomain.de/user/1/guestbook
http://:alias.meinedomain.de/user/1/guestbook/add

Die id des aktuellen Users kann ich über die subdomain schon auslesen
durch einen before_filter im application Controller… Aber ich bekomme
vernünftiges routing nicht hin. Ich möchte z.B. wenn es keine Subdomain
gibt oder subdomain == [www,admin, …] ist die normale startseite
anzeigen. Wenn nicht die jeweilige profilseite des users.

Für jeden Gedankenanstoß bin ich dankbar.

Malte

Am 18.03.2008 um 10:58 schrieb Malte B.:

Die id des aktuellen Users kann ich über die subdomain schon
auslesen durch einen before_filter im application Controller…
Aber ich bekomme vernünftiges routing nicht hin. Ich möchte z.B.
wenn es keine Subdomain gibt oder subdomain == [www,admin, …] ist
die normale startseite anzeigen. Wenn nicht die jeweilige
profilseite des users.

mephisto is mulit-site also deine Richtung.
Tendenziell aber glaub ich wäre es wohl günstiger/schneller vom
Webserver
die url umschreiben zu lassen.

ciao, tom


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
(NEW)
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]

Hi Tom,

Thomas R. Koll schrieb:

Tendenziell aber glaub ich wäre es wohl günstiger/schneller vom Webserver
die url umschreiben zu lassen.

Mh… günstig und schnell soll es ja nicht sein, sondern schön :wink:

weitere Tipps sind wilkommen!

Malte

Hallo Malte,

vielleicht hilft dir das hier:

http://weblog.jamisbuck.org/2006/10/20/monkey-patching-rails-
extending-routes-1
http://weblog.jamisbuck.org/2006/10/26/monkey-patching-rails-
extending-routes-2
http://svn.jamisbuck.org/rails-plugins/routing_tricks/

Mit dem Plugin kannst Du dann einfach sowas machen:

map.connect “/”, :controller => “main”, :conditions => { :subdomain
=> “www” }
map.connect “/”, :controller => “members”

Hoffe, das hilft!

Grüße, Niko.

Hi Niko,
nachdem einige Zeit ins Land gegangen ist führe ich den Thread mal
weiter…

Ich habe es nun mehr oder minder zum Laufen bekommen, aber das Gelbe vom
Ei ist es immer noch nicht.
Ich habe es mittels routing_tricks wie in deinem Beispiel umgesetzt.

Leider erkennt er damit ja nicht welche subdomains wirklich
existieren… Am liebsten hätte ich sowas:

map.connect “/”, :controller => “main”, :conditions valid_account
def valid_account
Account.find_by_subdomain «subdomain»
end

Aber ich weiß nicht wo man sowas implementieren könnte…

Oder vlt gibt es ja noch einen anderen vlt auch schöneren Lösungsansatz.

Gruß Malte

Niko D. schrieb:

Hey Niko,
danke für die schnelle und kompetente Antwort…
Jetzt stellt sich nurnoch die Frage wo ich meine valid_account? Methode
einbauen muss?

Malte

Niko D. schrieb:

Hi Malte,

Am 02.04.2008 um 10:33 schrieb Malte B.:

Hi Niko,
nachdem einige Zeit ins Land gegangen ist führe ich den Thread mal
weiter…

Ich habe es nun mehr oder minder zum Laufen bekommen, aber das Gelbe
vom Ei ist es immer noch nicht.
Ich habe es mittels routing_tricks wie in deinem Beispiel umgesetzt.

Leider erkennt er damit ja nicht welche subdomains wirklich
existieren… Am liebsten hätte ich sowas:
Aha! Dafür haben wir das routing-tricks plugin etwas aufgebohrt.

map.connect “/”, :controller => “main”, :conditions valid_account
def valid_account
Account.find_by_subdomain «subdomain»
end

Aber ich weiß nicht wo man sowas implementieren könnte…
Wir haben da sowas wie

:conditions => { :subdomain => /[\w\d_-]+/, :proc => valid_account? }

in den routes und dann ein proc, das env als argument nimmt und
ActiveRecord benuzt, um den Profil-Typ zu ermitteln. Das routing-
tricks plugin dann noch schnell erweitert (im RouteExtensions module):

     def self.included(base)
       base.alias_method_chain :recognition_conditions, :proc
     end

     def recognition_conditions_with_proc
       result = recognition_conditions_without_proc
       result << "(conditions[:proc].call(env))" if

conditions[:proc]
result
end

und los geht’s! :smiley:

Ich drück’ Dir die Daumen!

Grüße, Niko.

Am 02.04.2008 um 11:13 schrieb Malte B.:

Hey Niko,
danke für die schnelle und kompetente Antwort…
Jetzt stellt sich nurnoch die Frage wo ich meine valid_account?
Methode einbauen muss?
Du kannst auch erstmal Dein Proc direkt in die routes.rb schreiben,
zum ausprobieren.

Später dann packst Du das Proc in ne extra Methode irgendwo, wo sie
vor der routes.rb geladen wird, halt. In’s environment.rb (vor dem
Rails::Initializer.run Aufruf) z.B. (doofe Idee) oder in irgend eine
Datei, die Du aus environment.rb requirest (wie auch immmer das
deutsche Verb zu ‘require’ ist; bessere Idee). Added bonus: Wenn Du’s
in ner extra Methode hast, kannst Du das Proc halt auch testen.

Niko._______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Am 02.04.2008 um 11:13 schrieb Malte B.:

Hey Niko,
danke für die schnelle und kompetente Antwort…
Jetzt stellt sich nurnoch die Frage wo ich meine valid_account?
Methode einbauen muss?

Im ApplicationController natürlich, als before_filter


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
(NEW)
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]

Am 02.04.2008 um 11:27 schrieb Niko D.:

die Logik, die entscheidet, ob es sich um eine valide subdomain
handelt in ein Proc, das erst dann ausgewertet wird, wenn der
Request vom routing verarbeitet wird.

Ich find’s ehrlich gesagt etwas eklig die routing conditions um ein
proc zu erweitern,
wer denkt denn schon beim nächsten upgrade noch daran?
Ich würd das routing nur dazu benutzen um auf den richtigen
controller/action zu zielen,
und ob’s den user überhaupt gibt erst im controller
prüfen.
Um nochmal drauf hinzuweisen, mephisto ist ein gutes Beispiel, da
läuft im multisite mode
als before_filter set_cache_root welches mit request.subdomains
arbeitet.

Da ist kein Hack dabei, keine core-class erweitert und nix über das
man sich beim nächsten
upgrade Gedanken machen muss.

ciao, tom


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
(NEW)
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]

Am 02.04.2008 um 11:40 schrieb Thomas R. Koll:

von Rails. Die routes.rb wird auch nur einmal gelesen. Daher muss
Um nochmal drauf hinzuweisen, mephisto ist ein gutes Beispiel, da
läuft im multisite mode
als before_filter set_cache_root welches mit request.subdomains
arbeitet.

Da ist kein Hack dabei, keine core-class erweitert und nix über das
man sich beim nächsten
upgrade Gedanken machen muss.
In unserem Fall muss im Routing anhand der Subdomain entschieden
werden, von welchem Typ das Profil ist und dann auf den entsprechenden
Controller geroutet werden. Wenn man das braucht, kommt man das Proc
im Routing nicht rum. Wenn man’s nicht braucht, sollte man in der Tat
auf keinen Fall tun.

Niko._______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

HuHu
also lieber so z.B.?:

«application.rb»

before_filter :valid_subdomain?

private

def valid_subdomain?
subdomain = request.subdomains.first
if [‘www’, ‘admin’, nil].include? subdomain
session[:subdomain_view] = false
return true
else
@account = Account.find_by_subdomain(subdomain)
if @account.nil?
render :text => ‘Fehler’, :status => 404
session[:subdomain_view] = false
false
else
session[:subdomain_view] = true
true
end
end
end

Wenn der User über eine Subdomain kommt darf er bestimmte Controller
nicht aufrufen. Deshalb habe ich :subdomain_view damit ich damit die
einzelnen Controller filtern kann…

Was sagt ihr dazu?

Thomas R. Koll schrieb:

Am 02.04.2008 um 11:18 schrieb Thomas R. Koll:

Am 02.04.2008 um 11:13 schrieb Malte B.:

Hey Niko,
danke für die schnelle und kompetente Antwort…
Jetzt stellt sich nurnoch die Frage wo ich meine valid_account?
Methode einbauen muss?

Im ApplicationController natürlich, als before_filter
Nein. Zu spät! Die Routes werden einmal generiert, beim Starten von
Rails. Die routes.rb wird auch nur einmal gelesen. Daher muss die
Logik, die entscheidet, ob es sich um eine valide subdomain handelt in
ein Proc, das erst dann ausgewertet wird, wenn der Request vom routing
verarbeitet wird.

Niko._______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs