2017-02-17 58 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參數可選,因爲不是所有的函數都需要參數? –

相關問題