Контроллеры двигателя не будут загружены до тех пор, пока он не будет установлен, я полагаю.Я не смог найти путь к двигателю так, как вы хотите, но я нашел следующие способы:
1) Смонтировать двигатель в корне (вероятно, не совсем то, что вы хотели)
mount MyEngine => '/', as: :myengine
2) Перенаправить root на движок
# For redirecting to the engine's mount
root to: redirect { Rails.application.routes.url_helpers.myengine_path }
# For a specific engine path
root to: redirect { MyEngine.routes.url_helpers.some_path }
Если вы не возражаете жестко прописать путь вашего движка, вы можете просто:
root to: '/myengine/url'
Возможно, существуетлучший способ справиться с этими помощниками на маршрутах, но это был самый прямой способ, который я мог найти.Я наткнулся на этот ответ на слегка связанный вопрос, в котором упоминается создание помощника специально для такого рода вещей.Адаптация его для использования с движком может дать что-то вроде:
class UrlRedirectHelper
# This makes the case where you just want to use the main app's routes less verbose
def self.method_missing(method, *args, **kwargs)
new.public_send(method, *args, **kwargs)
end
# This is some entirely unnecessary sugar, I just like the way it reads
def self.for(engine)
new(engine)
end
def initialize(engine = Rails.application)
@engine = engine
end
# This is called by `redirect` when it's preparing to redirect the user
def call(_params, _request)
url_helpers.public_send(@method, *@args, **@kwargs)
end
def method_missing(method, *args, **kwargs)
super unless url_helpers.respond_to? method
@method = method
@args = args
@kwargs = kwargs
self
end
private
# you could also `delegate` this, but it keeps the API cleaner to make it private
def url_helpers
@engine.routes.url_helpers
end
end
Что тогда используется так:
get :somepath, to: redirect(UrlRedirectHelper.some_other_path)
# or, for an engine
get :somepath, to: redirect(UrlRedirectHelper.for(MyEngine).some_other_path)