8

我動態創建的形式username.users.example.com的網址:Ruby on Rails的路線通配符子域控制器/動作

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

所有*.users.example.com請求應該去一個特定的控制器/動作。我如何在routes.rb中指定此項?

www.example.com的所有其他請求轉到我的routes.rb文件中的正常路由列表。

UPDATE:我看railscast about subdomains,它顯示下面的代碼位,它似乎是正是我需要(改變控制器和子域):

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

的問題是它只匹配根網址。我需要這個來匹配每個可能的網址和一個*.users子域名。所以顯然我會把它放在我的routes.rb文件的頂部。但是,我如何指定一個全通路線?難道只是'*'?或'/*'

+0

這railscast可以幫助你:http://railscasts.com/episodes/221-subdomains-in-rails-3?autoplay=true –

+0

軌3導軌3.2導軌4 hmhmmmm ......究竟哪一個?就像一個側面說明,如果你打算有大量的JavaScript,請記住跨子域的ajax是一個PITA。 – phoet

+0

@phoet - 我應該更清楚Rails的版本。我使用的是3.2,但如果這意味着此解決方案會更容易,則會升級到4.0。 –

回答

7

我想,你只需要做到以下幾點:

lib創建類Subdomain

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

,並在您routes

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

可以動態約束路由根據一些具體標準創建matches?方法

可以說,我們要篩選我們這裏做的是檢查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 

的子域,如果它開始與子域users然後只打users#show行動。你的班級必須有mathes?方法,無論是類方法還是實例方法。如果你想成爲一個實例方法然後做

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

可以實現使用lambda以及像下面一樣的東西。

而是寫作班的,我們也可以使用lambdas

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