从父应用程序重新打开Rails 3引擎类

时间:2011-03-01 14:48:52

标签: ruby-on-rails ruby-on-rails-3 rails-engines

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

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

如果父应用中存在同名文件,则my_engine中的文件甚至无法加载。更多细节在这里:

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

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

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

1 个答案:

答案 0 :(得分: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