Я разрабатываю приложение для направляющих, которое значением по умолчанию настраивает учетные записи пользователей к субдомену их выбора. Как опция, они смогут отобразить свой собственный полный домен на их учетную запись.
До сих пор это - то, как мне настраивали вещи. Я использую субдомен-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 затем субдоменом-fu, не собирается направлять соответствующие маршруты?
Я предполагаю, что это не то, что необычный проблема, таким образом, кто-либо может совместно использовать, как они занялись этой проблемой, или как я настроил бы свои маршруты, чтобы сделать то, к чему я нуждаюсь в ней?
Используйте дискретное равномерное распределение из случайного модуля по достаточному количеству значений, затем разделите его:
Например, в случае 701 используйте распределение по 10 значениям, для 2 значений возвращаем 1, для других 3 возвращаем 2, а для других 5 возвращаем 3.
Вы можете построить любое распределение, используя достаточно однородных распределений:)
-121--1858946- с помощью String.format («% s% s», this.getField1 (), this.getField2 ());
будет лучшим способом для этого, поскольку методы .getXXX ()
могут иметь логику, которая вам нужна Это самый безопасный способ сделать это, на случай, если кто-то придет и добавит логику в метод .getXXX ()
, и они не думают обновлять .toString ()
.
Я столкнулся с этой проблемой, пытаясь сделать слишком много в одном приложении. Вы начнете делать условия в очень странных местах, которые вам не нужно. Я решил иметь 2 отдельных приложений Rails, которые имеют подстановочный домен, точку приложению Пользователя, а затем иметь www.domain.com
и domain.com
точек на стороне, обращенной к публике. Я знаю, что это не совсем «отвечает» на ваш вопрос напрямую.
Небольшой кодовый запах там, что я могу помочь вам исправить, если добавить это в верхней части этого метода:
return @current_club if defined?(@current_club)
Он не будет делать запрос для каждый раз, когда вы пытаетесь получить доступ @ current _ club
, он вернет результат, который вы уже вернули.
Вы можете написать промежуточное программное обеспечение, которая преобразует домен в поддомен, прежде чем он попадает в приложение 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
Затем добавьте это в enducial.rb
:
config.middleware.use AccountDetector