Повторное открытие моделей и контроллеров из приложения 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

По какой-то причине эта стратегия не работает для моделей.

Другие вопросы по тегам