Rails路由来处理单个应用程序中的多个域

尽pipe在这里和其他地方有几个类似的问题,但我一直无法find解决这个问题的可行scheme。 Rails 3似乎没有回答这个问题,所以在这里:

我有一个应用程序,目前允许用户创build自己的子域,其中包含他们的应用程序的实例。 在Rails 2中,最好的方法是使用subdomain-fu gem,而在版本3中则更加简单,就像Railscast一样 – http://railscasts.com/episodes/221-subdomains-in-rails-3 。

这是好东西,但我也想提供用户将自己的域名与他们的帐户关联的选项。 所以虽然他们可能有http://userx.mydomain.com ,我想他们也select有http://userx.com关联。

我在Rails 2中发现了一些引用,但是这些技术似乎不再适用(特别是这一个: http : //feefighters.com/devblog/2009/01/21/hosting-multiple-domains-from -a-single-rails-app / )。

任何人都可以推荐一种方法来使用路由来接受任意域,并将其传递给控制器​​,以便我可以显示适当的内容?

更新 :现在我已经得到了大部分答案,感谢列昂尼德的及时回应,并重新审视了代码。 它最终需要添加到我使用的现有子域代码(从Railscast解决scheme),然后添加一些到routes.rb。 我还没有完成,但是我想发布我到目前为止所做的。

在lib / subdomain.rb中:

class Subdomain def self.matches?(request) request.subdomain.present? && request.subdomain != "www" end end class Domain def self.matches?(request) request.domain.present? && request.domain != "mydomain.com" end end 

我已经添加了第二个模仿第一个,这是已知的工作。 我只是添加一个条件,确保传入的域不是我主要的主站点。

这个类在routes.rb中使用:

 require 'subdomain' constraints(Domain) do match '/' => 'blogs#show' end constraints(Subdomain) do match '/' => 'blogs#show' end 

在这里,我正在预先考虑现有的子域代码(再次,它工作正常)与一节来检查域。 如果此服务器响应该域,而不是主站点运行的域,则转发到指定的控制器。

虽然这似乎有效,但我还没有把整个工作做好,但我认为这个问题已经解决了。

它实际上更简单的Rails 3,根据http://guides.rubyonrails.org/routing.html#advanced-constraints

1)在lib/domain_constraint.rb定义一个自定义约束类:

 class DomainConstraint def initialize(domain) @domains = [domain].flatten end def matches?(request) @domains.include? request.domain end end 

2)使用新的块语法在路线中使用该类

 constraints DomainConstraint.new('mydomain.com') do root :to => 'mydomain#index' end root :to => 'main#index' 

或老式的选项语法

 root :to => 'mydomain#index', :constraints => DomainConstraint.new('mydomain.com')