Маршруты в двигателе, установленном на субдомене, не наследуют ограничений

Настройка

Наше текущее приложение 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

Двигатель - это просто имя, разделяющее ваш код