2011-09-19 56 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