8

creo dinamicamente URL del modulo username.users.example.com:Ruby on Rails rotta per sottodomini jolly per un controller/action

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

Tutti *.users.example.com richieste dovrebbe andare a una particolare scheda/azione. Come posso specificarlo in routes.rb?

Tutte le altre richieste a www.example.com passano alla normale lista di percorsi nel mio file routes.rb.

UPDATE: guardo il railscast about subdomains ed ha mostrato il seguente pezzo di codice che sembra essere esattamente quello che mi serve (cambiato il controller e sottodominio):

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

Il problema è che corrisponde solo all'URL di root. Ho bisogno di questo per abbinare OGNI URL possibile con un sottodominio *.users. Quindi ovviamente lo metterei in cima al mio file routes.rb. Ma come posso specificare un percorso catch-all? È semplicemente '*'? O '/*'?

+0

Questo Railscast potrebbe aiutare: http://railscasts.com/episodes/221-subdomains-in-rails-3?autoplay=true –

+0

rotaie 3 rotaie 3.2 rotaie 4 hmmmmmm ... quale esattamente? proprio come una nota a margine, se prevedi di avere un sacco di javascript, tieni a mente che ajax attraverso i sottodomini è un PITA. – phoet

+0

@phoet - Avrei dovuto essere più chiaro con le versioni di Rails. Sto usando 3.2, ma aggiornerei a 4.0 se significasse che questa soluzione sarebbe più facile. –

risposta

7

penso, è sufficiente effettuare le seguenti operazioni:

creare una classe Subdomain in lib:

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

e nel tuo routes:

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

È possibile vincolo percorso dinamico in base ad alcuni criteri specifici creando un metodo matches?

Diciamo che dobbiamo filtrare sub dominio dell'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 

Quello che stiamo facendo qui sta controllando per URL se si inizia con sottodominio users allora solo ha colpito users#show azione. La tua classe deve avere il metodo mathes? o metodo di classe o metodo di istanza. Se si vuole rendere un metodo di istanza poi fare

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

si può ottenere stessa cosa usando lambda così come qui di seguito.

Invece di corso di scrittura possiamo anche usare lambdas

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