2011-03-01 66 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

相關問題