就目前而言,只需在父应用程序的/app
目录中添加相同的类,就无法重新打开引擎/app
目录中包含的引擎类。例如:
/my_engine/app/controllers/users_controller.rb
/my_app/app/controllers/users_controller.rb
如果父应用中存在同名文件,则my_engine
中的文件甚至无法加载。更多细节在这里:
我正在寻找一种解决方法,允许我在与父应用程序相同的路径中删除相同的文件名/类,并重新打开而不是覆盖该类。也许我错过了一些明显的东西。我能够使用一个使用class_eval的单独文件(不同的文件名)来完成这项工作,但我对这个解决方案并不满意。关于优雅解决方案的任何想法?
我也想知道这个限制背后是否有原因,或者它只是rails如何加载文件(参见包含链接)而非故意的结果。在我看来,改变引擎的加载行为以允许以这种方式重新打开类将是rails中的一个很好的特性。我知道一开始我很困惑,我相信其他开发人员也会对这个问题感到困惑。
答案 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