2011-09-19 59 views
3

我想重寫一個位於Ruby/Rails中的Gem中的方法,並且我正在努力解決一些問題。從模塊方法調用超級模塊

我的目標是在調用Gem中的某個方法時執行自定義代碼,但也會繼續執行原始代碼。

我試圖抽象的代碼放到下面的腳本:

module Foo 
    class << self 
    def foobar 
     puts "foo" 
    end 
    end 
end 

module Foo 
    class << self 
    def foobar 
     puts "bar" 
     super 
    end 
    end 
end 


Foo.foobar 

執行這個腳本給我這個錯誤:

in `foobar': super: no superclass method `foobar' for Foo:Module (NoMethodError) 

我應該怎麼寫壓倒一切的方法,所以我可以叫超與這個例外被提出?

PS:重寫工作得很好,如果我刪除超級,但然後原來的方法沒有被調用,我不想這樣。

回答

6

調用super查找方法查找鏈中的下一個方法。錯誤告訴你到底你在做什麼:Foo的方法查找鏈中有foobar方法,因爲它沒有從任何東西繼承。您在示例中顯示的代碼僅僅是對Foo模塊的重新定義,因此第一個Foo什麼也不做。

+0

^這一點,你只需重新定義方法foobar的 – derp

+0

好吧,我現在明白了。 非常感謝! – Elhu

9

你可以做你想做的是這樣的:

module Foo 
    class << self 
    alias_method :original_foobar, :foobar 
    def foobar 
     puts "bar" 
     original_foobar 
    end 
    end 
end 
+1

我認爲這是正確的答案tim –

+1

你先生是英雄。謝謝。 – zachaysan