2017-02-17 57 views
0

我正在使用一些元编程(使用ruby 2.3.1),以便在调用实际方法之前调用我想调用的方法 - 就像before_filter/before_action。NoMethodError:undefined method`alias_method'

下面的伪代码解释什么,我试图实现

module Api 
    def call_this_method_everytime 
    if A 
     go ahead and call the actual method being called 
    else 
     stop here do not call he method it was supposed to call 
    end 
    end 

    def when_i_call_this_method 

    end 

    def or_this_method 

    end 
end 

有所谓成员,我能够从理论上理解我想用元编程做的帮助 - 这是我得出了下面的代码。

module Api 
    def heartbeat 
     ... 
    end 

    def interceptor(name) 
     original_method = "original #{name}" 
     alias_method original_method, name 
     define_method(name) do |*args| 
     heartbeat 
     result = send original_method, *args 
     puts "The method #{name} called!" 
     result 
     end 
    end 

end 

与其说我想要的方式 - 我称之为具有实际功能,我想作为参数调用的名称拦截方法。然后,我会先打电话heartbeat功能,如果检查是好的,然后我继续实际调用实际功能。

但是有元编程的知识有限,我得到这个错误

NoMethodError: undefined method 'alias_method'

搜索周围没有帮助。任何帮助赞赏。

+0

alias_method是有效的支持方法,这就是为什么你要在这里可能是不确定的。 –

+0

让我看看我是否正确理解 - 当调用'interceptor(my_method)'时,您想修改my_method以在继续使用其原始功能之前首先调用heartbeat?在你的代码中,你使用alias_method来创建原始方法的一种“拷贝”,然后你可以调用修改后的方法,一旦你调用了心跳? – eiko

+0

我以前误解了这个问题,下面是一个更接近你想要做的更新版本。 –

回答

1

做同样的事情的一个简单的方法:

def interceptor(name, *args) 
    if 1 == 1 
    send name, args 
    end 
end 

interceptor(:puts, "oi") 
+0

我认为petros希望拦截器被调用一次,导致未来的方法调用被拦截。这需要每次调用拦截器。 – eiko

+0

@eiko实际上我想每次都调用它,因为我正在检查服务器是否会先发送请求,然后再发送请求。 –

+0

佩德罗谢谢你的解决方案简单而整洁! (我们有同样的名字btw在差异语言heh)但是,我怎么能使* args参数可选,因为不是所有的函数都需要参数? –

相关问题