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

2024-05-18

就目前而言,您无法重新打开引擎中包含的引擎类/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/ http://www.cowboycoded.com/2011/02/28/why-you-cant-reopen-rails-3-engine-classes-from-the-parent-app/

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

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


在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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从父应用程序重新打开 Rails 3 引擎类 的相关文章

随机推荐