Как сопоставить полный домен с учетной записью приложения Rails на поддомене? - PullRequest
5 голосов
/ 15 января 2010

Я разрабатываю приложение 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

В дополнение к этому, я использую метод , описанный здесь , чтобы получить доступ к учетной записи через поддомен или полный домен:

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 ]

3 голосов
/ 16 января 2010

Вы можете написать промежуточное ПО 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
2 голосов
/ 15 января 2010

Я столкнулся с этой проблемой, пытаясь сделать слишком много в одном приложении. Вы начнете делать условные выражения в очень странных местах, которые вам не нужны. Я решил иметь 2 отдельных приложения Rails, которые имеют подстановочный домен, указывающий на приложение пользователя, а затем www.domain.com и domain.com указывают на открытую сторону. Я знаю, что это не совсем "отвечает" на ваш вопрос напрямую.

Небольшой запах кода, который я могу помочь вам исправить, если вы добавите это в начало этого метода:

return @current_club if defined?(@current_club)

Он не будет запрашивать каждый раз, когда вы пытаетесь получить доступ к @current_club, он будет возвращать результат, который вы уже вернули.

...