8

I dynamisch URLs der Form erstellen username.users.example.com:Ruby on Rails Weg für Wildcard Sub-Domains zu einem Controller/Aktion

bob.users.example.com 
tim.users.example.com 
scott.users.example.com 

Alle *.users.example.com Anfragen an einen bestimmten Controller/Aktion gehen sollte. Wie kann ich dies in routes.rb angeben?

Alle anderen Anfragen an www.example.com gehen Sie zu der normalen Liste von Routen in meiner routes.rb Datei.

UPDATE: Ich die railscast about subdomains beobachten und es zeigte das folgende Stück Code, das genau zu sein scheint, was ich brauche (geändert den Controller und Sub-Domain):

match '', to: 'my_controller#show', constraints: {subdomain: /.+\.users/} 

Das Problem ist, es entspricht nur der Stamm-URL. Ich brauche das, um JEDE mögliche URL mit einer *.users Subdomain übereinzustimmen. Also würde ich es natürlich an die Spitze meiner routes.rb Datei setzen. Aber wie lege ich eine Sammelroute fest? Ist es einfach '*'? Oder '/*'?

+0

Diese Railscast könnte Ihnen helfen: http://railscasts.com/episodes/221-subdomains-in-rails-3?autoplay=true –

+0

Schienen 3 Schienen 3.2 Schienen 4 hmhmmmmm ... welche genau? Nur als eine Randnotiz, wenn Sie planen, viel Javascript zu haben, dann denken Sie daran, dass Ajax über Subdomains eine PITA ist. – phoet

+0

@phoet - Ich hätte mit den Rails-Versionen klarer werden sollen. Ich verwende 3.2, würde aber auf 4.0 upgraden, wenn das bedeutet, dass diese Lösung einfacher wäre. –

Antwort

7

Ich denke, Sie tun müssen, nur die folgenden:

erstellen Sie eine Klasse Subdomain in lib:

class Subdomain 
    def self.matches?(request) 
     request.subdomain.present? && request.host.include?('.users') 
    end 
    end 

und in Ihrem routes:

constraints Subdomain do 
    match '', to: 'my_controller#show' 
end 
0

Sie können die Routen Constraint dynamisch basierend auf einigen spezifischen Kriterien durch Erstellen einer matches? Methode

Können sagen, wir Sub-Domain der URL

constraints Subdomain do 
    get '*path', to: 'users#show' 
end 

class Subdomain 
    def self.matches?(request) 
    (request.subdomain.present? && request.subdomain.start_with?('.users') 
    end 
end 

Was wir tun, hier ist die Überprüfung für URL-Filter, wenn es mit Sub-Domain starten users dann traf nur users#show Aktion. Ihre Klasse muss mathes? entweder Klassenmethode oder Instanzmethode haben. Wenn Sie eine Instanz-Methode machen wollen, dann tun

constraints Subdomain.new do 
    get '*path', to: 'proxy#index' 
end 

Sie elbe lambda auch mit wie unten erreichen können.

Statt zu schreiben Klasse können wir auch verwenden lambdas

get '*path', to: 'users#show', constraints: lambda{|request|request.env['SERVER_NAME'].match('.users')}