ruby-on-rails - Rails 路由可在单个应用程序上处理多个域

标签 ruby-on-rails ruby-on-rails-3 routes subdomain

尽管这里和其他地方有几个类似的问题,但我一直无法找到解决此问题的可行解决方案。这个问题似乎在 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 中发现了一些关于执行此操作的引用,但这些技术似乎不再起作用(特别是这个: https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails-app/ )。

任何人都可以推荐一种使用路由接受任意域并将其传递到 Controller 以便我可以显示适当内容的方法吗?

更新:由于 Leonid 的及时回复以及对代码的重新审视,我现在已经得到了大部分答案。它最终需要添加到我正在使用的现有子域代码(来自 Railscast 解决方案),然后添加一些到 paths.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

在这里,我在现有的子域代码(同样,它工作正常)前面加上一个节来检查域。如果该服务器响应该域,但它不是主站点运行的域,则转发到指定的 Controller 。

虽然这似乎有效,但我还没有完全解决整个问题,但我认为这个特定问题已经解决了。

最佳答案

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) 使用新的 block 语法在路由中使用该类

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

root :to => 'main#index'

或者老式的选项语法

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

关于ruby-on-rails - Rails 路由可在单个应用程序上处理多个域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207657/

相关文章:

java - 在 netty 中路由请求以将它们委托(delegate)给不同方法的最佳实践?

ruby-on-rails - before_filter 设置公共(public)实例变量 (Ruby On Rails)

mysql - 如何一次合并2个ID

Angular2 如何在我的网址中传递问号和一些单词

ruby-on-rails-3 - 如何使用 Capybara/RSpec 编写请求规范以测试 Sunspot/Solr 搜索?

ruby - 为 Rails 3 插件生成测试路由时出错?

Linux : I programatically changed my default route to eth0 but now I can't ping, 有什么建议吗?

javascript - ruby on Rails CoffeeScript 输入表单

ruby-on-rails - 刷新 ActiveRecord 结果

java - Java 在控制台中使用什么输出,我如何在 ruby​​ 中捕获它?