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

Posted

技术标签:

【中文标题】Ruby on Rails 将通配符子域路由到控制器/操作【英文标题】:Ruby on Rails route for wildcard subdomains to a controller/action 【发布时间】:2013-10-21 23:03:54 【问题描述】:

我动态创建 username.users.example.com 形式的 URL:

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。我需要它来匹配每个可能的 URL 与 *.users 子域。所以很明显我会把它放在我的routes.rb文件的顶部。但是我如何指定一条包罗万象的路线呢?仅仅是'*'吗?还是'/*'

【问题讨论】:

这个 railscast 可能会帮助你:railscasts.com/episodes/221-subdomains-in-rails-3?autoplay=true rails 3 rails 3.2 rails 4 hmhmmmm...到底是哪一个?顺便说一句,如果您打算拥有大量 javascript,请记住跨子域的 ajax 是 PITA。 @phoet - 我应该对 Rails 版本更清楚。我正在使用 3.2,但如果这意味着这个解决方案会更容易,我会升级到 4.0。 我的建议是:不要这样做。但是@AmitThawait 指出的railscast 就是一个很好的例子。您还可以在此处查看多租户示例:github.com/phoet/on_ruby/blob/master/config/routes.rb#L30 @phoet - 你是什么意思不这样做?不要创建我想要的应用程序?还有其他解决方案吗? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

您可以通过创建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')

【讨论】:

以上是关于Ruby on Rails 将通配符子域路由到控制器/操作的主要内容,如果未能解决你的问题,请参考以下文章

乘客(Ruby on Rails)中的301重定向从根域到www子域?

如何在 Ruby on Rails 中创建一个包罗万象的路由?

Ruby on Rails:将数组的 javascript 数组发送到 ruby​​ 控制器

我可以通过资源方法在 Ruby on Rails 应用程序中使用排除项设置路由吗?

如何使用 Ruby on Rails 将数据从控制器传递到模型?

ruby 使用控制数据库Rails多租户/多数据库和子域