Как принудительно использовать общедоступную схему для схемы Apartment Gem по умолчанию?

Я использую драгоценный камень Apartment с Unicorn и Nginx. Я использую лифт поддоменов. В initializers/apartment/subdomain_exclusions у меня есть Apartment::Elevators::Subdomain.excluded_subdomains = ['www']

Насколько я понимаю, общедоступная схема теперь должна использоваться либо с общедоступным субдоменом, либо с субдоменом www, либо без субдомена, например mydomain.com.

Однако это не работает таким образом. Когда я использую www или субдомен без него, он использует последнюю схему доступа. Поэтому, если бы я просто использовал другой субдомен, он использовал бы эту схему. Это не хорошо. Я даже пытался добавить config.default_schema = "public", но это ничего не дает.

Любые идеи, почему это не работает? Кто-нибудь настраивает его аналогичным образом, и используется только общедоступная схема, когда не указан субдомен? Возможно, это конфигурация Nginx?


person riley    schedule 26.02.2015    source источник


Ответы (2)


Я знаю, что этот ответ немного запоздал, но я столкнулся с похожей ситуацией и подумал, что опубликую решение.

Нам нужно было переключать арендаторов на основе пути запроса. Наши маршруты добавляли имя клиента к началу пути (например, /:tenant/some/action). Проблема в том, что все активы приложений явно попали под путь активов (т.е. /assets/application.css). Кроме того, мы помещаем консоль администратора по пути /admin.

Чтобы решить эту проблему, я использовал промежуточное ПО Generic и передал proc:

config.middleware.use 'Apartment::Elevators::Generic',
                          Proc.new { |request|
                            path = request.path.split('/')[1]
                            Apartment.tenant_names.include?(path) ? path: 'public'
                      }

Как я занимался маршрутизацией:

scope path: ':tenant', defaults: {tenant: 'default_tenant_if_necessary'} do
    resources :model
end
person tagCincy    schedule 24.03.2015
comment
Спасибо, похоже, что это сработает, даже не подумал об этом, так как думал, что это должно быть поведением по умолчанию. Я попробую изменить это для субдоменов и посмотреть, как это работает. - person riley; 26.03.2015
comment
@tagCincy, как вы изменили свои маршруты для обработки tenant_name, которое добавляется к каждому запросу? Вы думаете на route.rb или где-то еще? - person RailinginDFW; 03.04.2015

Я думаю, это из-за того, как это реализовано в Generic лифте. Он не переключает схему на значение по умолчанию, если подходящая база данных не найдена:

https://github.com/influitive/apartment/blob/development/lib/apartment/elevators/generic.rb#L21

Я не уверен, что это ошибка или сделано специально. Я бы предложил создать подкласс лифта Subdomain и перезаписать метод вызова.

person Artur Bilski    schedule 09.05.2016