【问题标题】:Reopen models and controllers from Engine in Rails 3.x app在 Rails 3.x 应用程序中从 Engine 重新打开模型和控制器
【发布时间】:2012-04-11 01:19:50
【问题描述】:

我想通过在 Rails 应用中重新打开它们来扩展 Engine 中的模型和控制器。问题是应用程序启动时没有加载它们。我知道有一些解决方案,例如Rails engines extending functionalityhow to override rails 3 engine models and controllers in the main application?,但我怀疑这是由于导轨的加载顺序,应该有一些巧妙的解决方案。

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

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

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

【问题讨论】:

标签: ruby-on-rails rails-engines


【解决方案1】:

您可以通过从 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

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

【讨论】:

【解决方案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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多