2011-03-01 65 views
7

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

/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来完成这项工作,但我对这个解决方案并不满意。任何想法在这个优雅的解决方案?

我也想知道是否有这个限制背后的原因,或者它只是导轨如何加载文件(请参阅附录链接)而不是故意的结果。在我看来,改变引擎的加载行为以允许以这种方式重新打开类将是一个很好的轨道功能。我知道它一开始让我困惑,我相信其他开发者也会为这个问题而苦恼。

+0

我发现这一点,有一个补丁:http://stackoverflow.com/q/5045068/378044 – johnmcaliley 2011-03-02 02:10:07

回答

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 
+0

我不知道,但也许 “config.reload_plugins =真正的” 是可选的。如果从本地路径加载插件(在Gemfile中),则不需要它 – 2012-11-03 20:29:30

相关问题