如何将完整域映射到基于子域的Rails应用程序帐户?

时间:2010-01-15 15:20:30

标签: ruby-on-rails ruby routing subdomain

我正在开发一个Rails应用程序,默认情况下会将用户帐户设置为他们选择的子域。作为一种选择,他们可以将自己的完整域名映射到他们的帐户。

到目前为止,这是我设置的方式。我正在使用subdomain-fu为路由提供支持:

# routes.rb
map.with_options :conditions => {:subdomain => true} do |app|
  app.resources # User's application routes are all mapped here
end

map.with_options :conditions => {:subdomain => false} do |www|
  www.resources # Public-facing sales website routes are mapped here
end

除此之外,我使用method described here通过子域或完整域名来访问帐户:

before_filter :set_current_account

def set_current_account
  if request.host.ends_with? current_domain
    # via subdomain
    @current_club = Club.find_by_subdomain(current_subdomain)
  else
    # via full domain
    @current_club = Club.find_by_mapped_domain(request.host)
  end
end

我还没有完成构建它的过程,但我已经看到我将遇到路由问题。如果request.host是某个random.com域,那么subdomain-fu不会路由相应的路由?

我认为这不是一个不寻常的问题,所以任何人都可以分享他们如何处理这个问题,或者我如何配置我的路线去做我需要的东西?

2 个答案:

答案 0 :(得分:3)

您可以编写一个Rack中间件,在将域转换为Rails应用程序之前将其转换为子域。

class AccountDetector
  def initialize(app)
    @app = app
  end

  def call(env)
    account = Club.find_by_mapped_domain(env["HTTP_HOST"])
    if account
      env["HTTP_HOST"] = "#{account.subdomain}.yourdomain.com"
    end

    @app.call(env)
  end
end

然后将其添加到environment.rb

config.middleware.use AccountDetector

答案 1 :(得分:2)

我遇到了这个问题,试图在一个应用程序中做太多。你将开始在非常奇怪的地方做条件,你不应该这样做。我决定让2个单独的Rails应用程序将通配符域指向用户的应用程序,然后将www.domain.comdomain.com指向面向公众的一方。我知道这并没有直接“回答”你的问题。

如果你把它添加到该方法的顶部,那么我可以帮助你解决小代码的问题:

return @current_club if defined?(@current_club)

每次尝试访问@current_club时都不会进行查询,它会返回您已返回的结果。