簡體   English   中英

從父應用程序重新打開Rails 3引擎類

[英]Reopening Rails 3 engine classes from parent app

就目前而言,只需在父應用程序的/app目錄中添加相同的類,就無法重新打開引擎/app目錄中包含的Engine類。 例如:

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

如果父應用程序中存在my_engine文件,則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中的一個很好的特性。 我知道一開始我很困惑,我相信其他開發人員也會對這個問題感到困惑。

在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM