2012-06-15 2 views
5

Ich versuche Subdomains in Rails 3 per Ryan Bates screencast on subdomains einzurichten. Aber es funktioniert nicht für mich. Ich habe folgendes Setup:requestsubdomain wird während des bedingten Routings nicht in Rails 3 gesetzt

# 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 

Laden der URL admin.localhost:3000/devices sollte Route mich devices#all aber ich eine Routing-Fehler erhalten Routing Error No route matches [GET] "/devices" klar meine Routing nicht funktioniert.

ich ein Setup pry Debug-Sitzung, wo der Kommentar oben ist, und es wird getroffen, so meine Einschränkung funktioniert, aber ich bekomme die folgende Ausgabe:

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

So Schienen ist Kommissionierung nicht den Admin-up Teil der URL und platzieren Sie es in der Subdomain-Variable. Während ich einfach den Host-Wert verwenden könnte, um auf die Admin-Routen zu filtern, möchte ich die Dinge sauber und korrekt halten.

Wie kommt es, dass rails den Subdomain-Wert nicht festlegt?


bearbeiten

Beide jdoe und coreyward sind richtig mit ihren Antworten. Was mich abwarf war, dass ich auch pow und xip.io benutzte, um auf die Seite zuzugreifen und denselben Fehler zu bekommen. Was war seltsam, weil http://admin.app_name.192.168.1.68.xip.io/devices hat eine Tld> 1. Was passierte war, dass die Subdomain für war admin.app_name.192.168.1.68, die auch fehlschlägt angesichts der Übereinstimmungen Logik und nicht routen.

+0

> Wie stellt Rails den Subdomain-Wert nicht ein? Ich denke, es ist immer noch Rack an diesem Punkt. –

+0

@OscarDelBen ist es nicht.Es ist ActionDispatch 'request.inspect # =>

+0

+1 für zusätzliche Erläuterungen zu Pow & Xip.io. :) – coreyward

Antwort

9

Weil es keine Subdomain gibt, soweit Rails es meint.

Rails erwartet, dass Sie für TLDs mit mehr als 1 Punkt eine Top-Level Domain (TLD) -Länge angeben. Zum Beispiel, wenn Sie bbc.co.uk es hätte pickup „bbc“ als Sub-Domain, wenn Sie die TLD angegebene Länge 2 ist, wobei in diesem Fall die Sub-Domain wäre leer:

request.subdomain(2) #=> "" 

Dies ist auch, warum sind Sie zu sehen subdomains Rückgabe eines leeren Arrays: Die letzten beiden Segmente werden automatisch gelöscht. Sie könnten 0 als TLD-Länge angeben, um "admin" zurückzubekommen, aber dieser Code wird in der Produktion mit einem echten Domainnamen brechen, also empfehle ich es nicht.

Ich empfehle die Verwendung einer Domain wie admin.yourapp.dev, die über localhost zurück zu Ihrem Computer geleitet wird, damit Ihre App eine Subdomain richtig erkennt. Bearbeiten Sie einfach/etc/hosts, um es einfach zu machen. Wenn Sie neugierig sind, here is the Rails source for the subdomain method.

+0

Danke für die Antwort. Ich habe Ihre korrekt markiert, da ich die Quelle für die Subdomänen-Methode vor der Veröffentlichung auf SO hätte betrachten sollen. : X –

5

Versuchen mit speziellen Adresse: http://admin.lvh.me:3000/devices

Oder gesetzt:

config.action_dispatch.tld_length = 0 

in Ihrem development.rb und starten Sie Ihre App.

+0

Danke @jdoe für die Antwort. Das Treffen von admin.lvh.me half dabei, die Dinge zu klären. –

+0

Einstellung action_dispatch_tld ist eine nette Software nur Lösung. scheint für meine Bedürfnisse zu arbeiten – Kevin