10

我动态创建表单的 URL 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,它显示了以下代码,这似乎正是我需要的(更改了控制器和子域):

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

问题是它只匹配根 URL。我需要这个来匹配每个可能的 URL 与*.users子域。所以很明显我会把它放在我routes.rb文件的顶部。但是我如何指定一条包罗万象的路线呢?是不是很简单'*'?或者'/*'

4

2 回答 2

9

我认为,您只需要执行以下操作:

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
于 2013-10-15T05:41:11.440 回答
-1

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

我们在这里所做的是检查 URL,如果它以子域开头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')}
于 2016-04-12T07:05:20.093 回答