7

就目前而言,您无法/app通过简单地在父应用程序的/app目录中添加相同的类来重新打开引擎目录中包含的引擎类。例如:

/my_engine/app/controllers/users_controller.rb
/my_app/app/controllers/users_controller.rb

my_engine如果父应用程序中存在同名文件,则文件 from甚至不会加载。更多细节在这里:

http://www.cowboycoded.com/2011/02/28/why-you-cant-reopen-rails-3-engine-classes-from-the-parent-app/

我正在寻找一种解决方法,它允许我将相同的文件名/类放在与父应用程序相同的路径中,然后重新打开而不是覆盖该类。也许我错过了一些明显的东西。我可以使用使用 class_eval 的单独文件(不同的文件名)来完成这项工作,但我对该解决方案并不满意。关于这个优雅的解决方案的任何想法?

我也想知道这个限制背后是否有原因,或者它只是rails加载文件的结果(参见包含的链接)而不是故意的。在我看来,改变引擎的负载行为以允许以这种方式重新打开类将是 rails 中的一个很好的特性。我知道一开始我很困惑,我相信其他开发人员也会遇到这个问题。

4

1 回答 1

9

在 Rails 3.2.2 / Ruby 1.9 中打开插件的重新加载,然后require_dependency在重新打开类和添加功能之前要求引擎中的类使用。这甚至在开发环境中也有效(即类重新加载)。

# development.rb
config.reload_plugins = true 

# app/controllers/my_engine/documents_controller.rb
require_dependency MyEngine::Engine.root.join('app', 'controllers', 'my_engine', 'documents_controller').to_s

module MyEngine
  class DocumentsController
    def show
      render :text => 'different'
    end
  end
end
于 2012-03-20T16:42:20.710 回答