Повторное открытие моделей и контроллеров из приложения Engine in Rails 3.x
Я хочу расширить модели и контроллеры из Engine, открыв их снова в приложении Rails. Проблема в том, что они не загружаются при запуске приложения. Я знаю, что есть некоторые решения для этого, такие как движки Rails, расширяющие функциональность, и как переопределить rails 3 модели двигателей и контроллеры в основном приложении?, но я подозреваю, что это связано с последовательностью загрузки рельсов, и должно быть какое-то аккуратное решение.
Тогда я сталкиваюсь с этим решением:
config.railties_order = [Blog::Engine, :main_app, :all]
Тем не менее, модели и контроллеры в Engine загружены, но не в рельсах. Просто интересно, кто-нибудь делал эту работу раньше?
2 ответа
Мое решение:
# === in engine
class EngineNameSpace::Blog
# logic goes here
end
class Blog < EngineNameSpace::Blog
# no codes should go here
end
# === in app
# If I need to extend the Blog class, I will code as below instead of reopenning the class
class Blog < EngineNameSpace::Blog
# do something
end
Объясните:
Rails блокирует загрузку классов движка, если они имеют то же имя файла / путь, что и в родительском приложении. См. http://www.cowboycoded.com/2011/02/06/making-the-case-for-rails-3-engines/
Вы можете снова открыть классы контроллеров, если главные контроллеры приложений Rails наследуются от Rails Engine. Это не требовало config.railties_order
чтобы заставить работать контроллеры,
#/app/controllers/answer_sheets_controller.rb
require YourCustomEngine::Engine.root.join('app', 'controllers', 'your_custom_engine', 'answer_sheets_controller')
class AnswerSheetsController < YourCustomEngine::AnswerSheetsController
По какой-то причине эта стратегия не работает для моделей.