Маршруты в двигателе, установленном на субдомене, не наследуют ограничений
Настройка
Наше текущее приложение Rails составлено из под-приложений, которые монтируются в качестве двигателей. Обычно эти двигатели монтируются на субдомене в главном файле routes.rb
следующим образом
mount MySubApp::Engine => '/', as: :sub_app, constraints: {subdomain: 'sub_app'}
Проблема
Маршруты в MySubApp
routes.rb
файле не получают поддомен при использовании названных _url
помощников. Например, следующее в apps/my_sub_app/config/routes.rb
MySubApp::Engine.routes.draw do
resources :foos
end
дает sub_app.foo_url(5)
, но это приводит к
Http:// WWW.example.com/Foos/5
когда мы хотим
Http:// sub_app.example.com/Foos/5
TL;DR
Как я могу получить ограничения монтирования двигателя, переданные его именованным маршрутам?
РЕДАКТИРОВАТЬ: Временное решение
Пока я предпочитаю лучшее решение, будет работать следующее. Вы можете обернуть все маршруты в каждом из файлов приложений routes.rb
, которые могут быть установлены на подобъекте подобным образом
MySubApp::Engine.routes.draw do
constraints Rails.application.routes.named_routes[:sub_app].constraints do
resources :foos
end
end
РЕДАКТИРОВАТЬ 2: Менее желательное обходное решение
Комментарий (после удаления?) указал, что вы можете передать опцию subdomain
для помощников, но нам бы хотелось избежать использования sub_app.foo_url(5, {subdomain: 'sub_app'})
для каждой кросс-субдоменной ссылки. Даже если мы переместили имя поддомена в ENV var и сделали обертку, это не СУХОЙ.
Ответы
Ответ 1
@Aaron не уверен, если вы когда-нибудь это исправили, но посмотрите на
config.action_dispatch.tld_length
(в конфигурации двигателя). Я не уверен, как это будет реагировать на работу с двигателями, но в нашем случае это позволяет нам обрабатывать случаи субдоменов для нашего промежуточного сервера (поэтому, когда мы используем помощники _url
с промежуточным сервером, он правильно делает subdomain.staging.domain.com
, а не subdomain.domain.com
).
Ответ 2
просмотрите guide, в котором говорится, что вы можете сделать это
namespace :Engine do
resources :controller, :methods
end
Двигатель - это просто имя, разделяющее ваш код