尽管在这里和其他地方有几个类似的问题,我一直无法找到解决这个问题的可行办法。似乎Rails 3没有回答这个问题,所以这里有:
我有一个应用程序,当前允许用户创建自己的子域,其中包含他们的应用程序实例。在Rails 2中,你最好使用subdomain-fu gem,在版本3中,根据Railscast - http://railscasts.com/episodes/221-subdomains-in-rails-3,它显然更简单。
这是件好事,但我也希望为用户提供将自己的域名与其帐户相关联的选项。因此,虽然他们可能http://userx.mydomain.com,但我希望他们选择关联http://userx.com。
我在Rails 2中发现了一些引用,但这些技术似乎不再起作用(特别是这一个:http://feefighters.com/devblog/2009/01/21/hosting-multiple-domains-from-a-single-rails-app/)。
有人可以推荐一种方法来使用路由接受任意域并将其传递给控制器,以便我可以显示相应的内容吗?
更新:我现在得到了大部分答案,感谢Leonid的及时回复,以及对代码的全新审视。它最终需要添加我正在使用的现有子域代码(来自Railscast解决方案),然后向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
在这里,我将现有的子域代码(再次,它工作正常)与一个节来检查域。如果此服务器响应该域并且它不是主站点运行的域,则转发到指定的控制器。
虽然这似乎有效,但我还没有完成所有工作,但我认为这个问题已经解决了。
答案 0 :(得分:93)
根据http://guides.rubyonrails.org/routing.html#advanced-constraints,它在Rails 3中实际上更简单:
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')
答案 1 :(得分:1)
在Rails 5中,您只需在路线中执行以下操作即可:
constraints subdomain: 'blogs' do
match '/' => 'blogs#show'
end