2012-06-15 12 views
5

Sto tentando di installare Sottodomini in Rails 3 per Ryan Bates screencast on subdomains. Comunque non sta funzionando per me. Ho la seguente configurazione:request.subdomain non viene impostato in Rails 3 durante l'instradamento condizionale

# routes.rb 
constraints(Subdomain) do 
    get 'devices' => 'devices#all' 
end 

# lib/subdomain.rb 
class Subdomain 
    def self.matches?(request) 
    # binding.pry 
    request.subdomain.present? && request.subdomain == "admin" 
    end 
end 

Caricamento l'url admin.localhost:3000/devices dovrebbe percorso mi devices#all, però io ottenere un errore di routing Routing Error No route matches [GET] "/devices" Chiaramente il mio percorso non funziona.

a configurare una sessione di pry di debug in cui il commento è al di sopra, e viene colpito, quindi il mio vincolo sta funzionando, ma ottengo il seguente output:

[1] pry(Subdomain)> request.subdomain 
=> "" 
[2] pry(Subdomain)> request.subdomains 
=> [] 
[3] pry(Subdomain)> request.host 
=> "admin.localhost" 

Quindi rotaie non è in ripresa l'amministratore porzione dell'URL e inserendola nella variabile del sottodominio. Mentre potrei facilmente usare il valore host per filtrare i percorsi di amministrazione, vorrei mantenere le cose pulite e corrette.

Come mai le rotaie non impostano il valore del sottodominio?


Modifica

Sia jdoe e coreyward sono corretti con le loro risposte. Ciò che mi ha stancato era che stavo usando anche pow e xip.io per accedere al sito e ottenere lo stesso errore. Il che era strano perché http://admin.app_name.192.168.1.68.xip.io/devices ha un tld> 1. Quello che stava accadendo era che il sottodominio per xip era admin.app_name.192.168.1.68, che fallisce anche data la logica delle partite e non si dirige.

+0

> Come mai le rotaie non impostano il valore del sottodominio? Penso che sia ancora Rack a quel punto. –

+0

@OscarDelBen non lo è.È ActionDispatch 'request.inspect # =>

+0

+1 per ulteriori chiarimenti su Pow & Xip.io. :) – coreyward

risposta

9

Perché non esiste un sottodominio per quanto Rails lo considera.

Rails prevede di fornire una lunghezza Top-Level Domain (TLD) per TLD con più di 1 punto. Ad esempio, se si ha bbc.co.uk sarebbe pick-up "BBC", come il sottodominio a meno che non specificato la lunghezza TLD è 2, nel qual caso il sottodominio sarebbe vuota:

request.subdomain(2) #=> "" 

Anche per questo motivo si sta vedendo subdomains restituisce un array vuoto: gli ultimi due segmenti vengono scartati automaticamente. È possibile specificare 0 come lunghezza TLD per tornare "admin", ma quel codice verrà interrotto in produzione con un nome di dominio reale, quindi non lo consiglio.

Si consiglia di utilizzare un dominio come admin.yourapp.dev che viene reindirizzato al computer tramite localhost per fare in modo che l'app rilevi correttamente un sottodominio. Basta modificare/etc/hosts per farlo semplicemente.

Se siete curiosi, here is the Rails source for the subdomain method.

+0

Grazie per la risposta. Ho contrassegnato i tuoi corretti in quanto avrei dovuto guardare il codice sorgente per il metodo di sottodominio prima di pubblicare su SO. :X –

5

Provare a utilizzare l'indirizzo speciale: http://admin.lvh.me:3000/devices

o Set:

config.action_dispatch.tld_length = 0 

nel vostro development.rb e riavviare la vostra applicazione.

+0

Grazie a @jdoe per la risposta. Colpire admin.lvh.me ha aiutato a chiarire molto le cose. L'impostazione –

+0

action_dispatch_tld è una buona soluzione solo software. sembra funzionare per i miei bisogni – Kevin

Problemi correlati