2013-10-04 70 views
4

我試圖讓導軌根據子域去不同的控制器#動作,這就是我在routes.rb中多「根」在軌線路4.0

Petworkslabs::Application.routes.draw do 

    get '/', to: 'custom#show', constraints: {subdomain: '/.+/'}, as: 'custom_root' 
    get '/', to: "welcome#home", as: 'default_root' 
end 

耙至今顯示了正確的路線,我希望它採取

rake routes 
     Prefix Verb URI Pattern    Controller#Action 
custom_root GET /      custom#show {:subdomain=>"/.+/"} 
default_root GET /      welcome#home 

但由於某些原因,我不能讓像abc.localhost請求:3000打定製控制器。它總是將其路由到歡迎#回家。有任何想法嗎?我相當新的軌道,所以任何關於一般調試的提示也將不勝感激。

編輯:我通過代碼臺階使用調試器,這是我的發現

(RDB:32)request.domain 「abc.localhost」 (RDB:32)request.subdomain 「」 (rdb:32)request.subdomain.present? false

看起來像某些原因,認爲子域不存在,即使它存在。我想知道它是否因爲我在做這個本地主機。

+0

爲什麼你加載一個家庭和在控制器上,你可以使重定向 – MZaragoza

+0

@ mZaragoza,我不遵循你的建議。你能再解釋一下嗎? –

+0

我使用任何sub-doamin獲得您的應用程序。應用程序控制器加載並從那裏你可以確定我來自哪個子doamin,然後你可以重定向我到適當的地方 – MZaragoza

回答

1

出於某種原因,request.subdomain根本沒有被填充(我懷疑這是因爲我在localhost上這樣做,我在這裏打開了一個bug https://github.com/rails/rails/issues/12438)。這導致routes.rb中的正則表達式匹配失敗。我結束了創建一個自定義匹配?子站點的方法,它看起來像這樣

class Subdomain 
    def self.matches?(request) 

    request.domain.split('.').size>1 && request.subdomain != "www" 
    end 
end 

和掛鉤,最多在routes.rb中

constraints(Subdomain) do 
    get '/', to: "custom#home", as: 'custom_root' 
end 

這似乎工作。

編輯:在GitHub的問題頁面的更多信息https://github.com/rails/rails/issues/12438

5

更新答:

爲我工作on Rails的3 & 4:

get '/' => 'custom#show', :constraints => { :subdomain => /.+/ } 
root :to => "welcome#home" 
+0

沒有運氣..它總是試圖路由到自定義#顯示每一件事情:( –

+0

看到我更新的答案。在我的本地機器上工作。到http:// localhost帶我到不同的頁面,而不是去http://test.localhost。 – manishie

+0

嗯,這是我以前試過沒有運氣...你在軌道4.0? –

1

@ manishie的答案是正確的,但如果您使用localhost,您仍然可能在您的devo環境中遇到問題。要修復它下面的行添加到config/environments/development.rb

config.action_dispatch.tld_length = 0 

,然後在routes.rb使用@ manishie的回答是:

get '/' => 'custom#show', :constraints => { :subdomain => /.+/ } 
root :to => "welcome#home" 

的問題是,tld_length默認爲1,並且有,當你沒有域擴展名使用本地主機,所以導軌無法拾取子域。 pixeltrix在這裏解釋得非常好:https://github.com/rails/rails/issues/12438