2013-09-16 51 views
1

我在一個類中有幾個函數。對於每個函數,我希望能夠指定在執行之前應該調用什麼,以及執行它之後要調用什麼。如何在rails中回調之前和之後添加泛型

例如,假設我的函數是a,b,c,d和e。我想要做的事情如下:

before: [:a, :b, :c], execute: :before_func 
after: [d, e], execute: :after_func 

是否有寶石或我可以用來完成上述的技術?

背景:

我的類基本上是一個從ftp讀取文件的類。我已經聲明瞭一個@ftp變量,它在創建類實例時初始化,然後在需要時嘗試從ftp讀取數據,或者在ftp上執行其他操作。現在,如果這些操作靠近在一起,它就會起作用,否則會造成超時。所以在每個函數之前我想關閉當前的@ftp,並重新打開一個新的連接並使用它。當函數結束時,我想關閉ftp連接。我已經編寫了大部分函數,​​因此只需聲明兩個函數,一個用於打開連接,另一個用於關閉連接。

+1

將你的方法包裝成塊 – apneadiving

回答

1

你可以通過define_methodalias_method_chain,一些使用一些紅寶石元編程像這樣也許:

before :a, :b, :c, :before_func 
after :a, :b, :c, :after_func 

以上(未經測試)代碼:

module MethodHooks 

    def before(*symbols) 
    hook=symbols.pop 
    symbols.each { |meth| 
     define_method :"#{meth}_with_before_#{hook}" do |*args, &block| 
     self.send hook, *args, &block 
     self.send :"#{meth}_without_before_#{hook}", *args, &block 
     end 
     alias_method_chain meth, :"before_#{hook}" 
    } 
    end 

    def after(*symbols) 
    hook=symbols.pop 
    symbols.each { |meth| 
     define_method :"#{meth}_with_after_#{hook}" do |*args, &block| 
     self.send :"#{meth}_without_after_#{hook}", *args, &block 
     self.send hook, *args, &block 
     end 
     alias_method_chain meth, :"after_#{hook}" 
    } 
    end 
end 

Object.extend(MethodHooks) 

然後在任意類中使用它演示了掛鉤實例方法的想法,但如果需要,還可以適應類方法。

相關問題