3

我想通过在 Rails 应用程序中重新打开它们来扩展 Engine 中的模型和控制器。问题是应用程序启动时没有加载它们。我知道有一些解决方案,比如Rails 引擎扩展功能以及如何在主应用程序中覆盖 rails 3 引擎模型和控制器?,但我怀疑这是由于导轨的加载顺序,应该有一些巧妙的解决方案。

然后我遇到了这个解决方案:

config.railties_order = [Blog::Engine, :main_app, :all]

但是,Engine 中的模型和控制器已加载,而不是 rails 中的模型和控制器。只是想知道以前是否有人做过这项工作?

4

2 回答 2

0

我的解决方案:

# === 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-引擎/

于 2012-07-12T12:12:21.650 回答
0

您可以通过从 Rails 引擎继承主 Rails 应用程序控制器来重新打开控制器类。这不需要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

由于某种原因,这种策略不适用于模型。

于 2012-07-11T23:11:12.270 回答