Ruby on Rails将通配符子域路由到控制器/操作

时间:2013-10-14 11:32:32

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 routes ruby-on-rails-4

我动态创建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文件的顶部。但是,我如何指定一个包罗万象的路线?它只是'*'吗?或'/*'

2 个答案:

答案 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')}