我动态创建username.users.example.com
形式的网址:
bob.users.example.com
tim.users.example.com
scott.users.example.com
所有*.users.example.com
个请求都应转到特定的控制器/操作。如何在routes.rb
?
www.example.com
的所有其他请求都会转到routes.rb
文件中的正常路由列表。
更新 :我看了railscast about subdomains,它显示了下面的代码,这似乎正是我需要的(更改了控制器和子域) ):
match '', to: 'my_controller#show', constraints: {subdomain: /.+\.users/}
问题是它只匹配根URL。我需要这个以匹配每个可能的网址与*.users
子网域。显然我会把它放在routes.rb
文件的顶部。但是,我如何指定一个包罗万象的路线?它只是'*'
吗?或'/*'
?
答案 0 :(得分:8)
我想,您只需要执行以下操作:
在Subdomain
中创建一个班级lib
:
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
答案 1 :(得分:-1)
您可以通过创建matches?
方法
假设我们必须过滤网址
的子域名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')}