2011-07-29 74 views
1

我有一個庫模塊,我想根據我在覆蓋特定軌道環境

模塊位於LIB /包/ my_module.rb運行Rails環境覆蓋LIB組件的方法:

module Package 
    module MyModule 
    puts "Defining original module" 
    def foo 
     puts "This is the original foo" 
    end 
    end 
end 

我已經能夠在Overriding a module method from a gem in Rails與信息,以部分解決 - 特別是,在我的環境/ dev_stub.rb:

Package::MyModule.module_eval do 
puts "Defining override" 
def foo 
    puts "This is foo override" 
end 
end 

(該鏈接其他的解決辦法似乎造成錯誤時,軌試圖查找包裝相關的其他類)

現在,這似乎讓我最那裏的方式,和工作,如果我設置

config.cache_classes = true 

...但我想將它用作存根開發環境,並且關於這個開發環境的值的評論推薦是使用false ...在這種情況下,覆蓋僅在模塊被包括時第一次起作用,並且隨後的任何時候它使用原始。

我的問題:我正在以正確的方式進行嗎?我可以砍了lib模塊本身基於RAILS_ENV有條件覆蓋,但我想保持它比吸塵器......

編輯

我的使用情況,這是從引用它一個控制器功能。如果我有

class SomethingController < ApplicationController 
    def show 
    Package::MyModule.foo 
    end 
end 

config.cache_classes=false(這是我最好要,因爲它是一個開發環境),並通過我的網頁瀏覽器(http://localhost/something/show)然後訪問的動作,我第一次打它,我的倍率加載它工作,但第二次和任何後來的時間,原始庫類被重新加載(輸出「定義原始模塊」在我的控制檯沒有「定義覆蓋」),並且覆蓋丟失。

我嘗試另一種方法是添加類似config.load_paths += %W(#{RAILS_ROOT}/lib_patch/#{RAILS_ENV})到environment.rb文件 - 確定,但在同一個模塊/類也不太工作,而投入的明確鉤在原有的庫基本上加載補丁如果它存在

編輯2(響應@apneadiving答案)

我試着這樣做沒有module_eval,只是使用下面的development_stub.rb:

require 'package/my_module' 
module Package 
    module MyModule 
    puts "Defining override" 
    def foo 
     puts "This is foo override" 
    end 
    end 
end 

我這樣做最初的問題是,Rails不再自動查找我的lib目錄中的所有內容,而且我需要在所有其他lib文件(以及引用該庫的控制器)中遍歷'require'語句以涵蓋所有的依賴關係。雖然這一切都完成了,但它確實有效,但它也有類似的效果,因爲所有的lib類都不會在更改時重新加載,即使在我沒有monkey-patch的常規開發環境中也是如此(因爲所有'require'語句被添加)。

回答

1

在dev_stub.rb中設置config.cache_classes=true並使用module_eval來定義問題中描述的修補程序似乎是實現目標的方法 - 爲模塊創建不影響其他環境的特定修補程序環境中的代碼路徑和Rails類加載行爲。

0

你可以簡單地覆蓋模塊,它的實例沒有module_eval

我想你的模塊是作爲一個Mixin包含的,它的方法不受你的猴子補丁的影響。

這就是alias_method_chain開始行動的地方。

請看this great article以瞭解如何使用它來滿足您的需求。

+0

我實際上已經嘗試過,但沒有使用module_eval,但Rails中的某些內容並不像這樣,並且導致在我嘗試使用其他庫代碼時找不到定義。我正在使用我的模塊作爲Mixin,儘管我重寫的方法也在同一個模塊中,所以我不確定alias_method_chain在這裏是否有用。 – Krease

+0

只需重新初始化重寫模塊方法,就可以正常工作。我無法幫助你。 – apneadiving

+0

我正在運行老版本的Rails(2.3.8),所以也許這與它有什麼關係? – Krease