2011-03-06 56 views
5

回調我嘗試這樣做:Rails的:從模塊

應用程序/模型/ my_model.rb:

class MyModel < ActiveRecord::Base 
    include MyModule 
    ... 
end 

的lib/my_module.rb:

module MyModule 
    before_destroy :my_func #! 

    def my_func 
    ... 
    end 
end 

,但我得到的錯誤:

undefined method `before_destroy' for MyModule:Module 

我該如何糾正它。

此外,我是新來的紅寶石。什麼類型具有這些「屬性」:before_destroy,validates,has_many? 他們是變數或方法還是什麼? 感謝

回答

14

before_destroyvalidates等不在屬性或類似的東西。這些是方法調用。

在紅寶石,一類的主體是所有的可執行代碼,這意味着類主體的每一行由interpeter就像一個方法本體上執行會。

before_destroy :my_func是通常的紅寶石方法調用。被調用的方法是before_destroy,它收到一個符號:my_func作爲參數。這個方法在被調用的範圍內的類(或模塊)中查找。

所以移動到你的問題,我覺得現在你應該明白,在翻譯時加載的模塊

module MyModule 
    before_destroy :my_func #! 

    def my_func 
    ... 
    end 
end 

它開始執行它的身體,並搜索此模塊中的方法before_destroy,不能找到一個。你想要做的就是不在模塊上調用這個方法,而是在包含該模塊的類上調用。爲此,我們有一個使用Module#included方法的常見成語:

module MyModule 
    module InstanceMethods 
    def my_func 
     ... 
    end 
    end 

    def self.included(base) 
    base.send :include, InstanceMethods 
    base.before_destroy :my_func 
    end 
end 
0

在LIB/my_module.rb,這樣做:

 
    class MyInheritedClass < ActiveRecord::Base 
    before_destroy :my_func 
    def my_func 
     ... 
    end 
    end 

在應用程序/模型/ my_model.rb,這樣做:

 
class MyModel < MyInheritedClass 
    ... 
end 

有模塊中沒有before_destroy過濾器你正試圖在上面創建。我的代碼所做的是創建一個將從ActiveRecord :: Base繼承的類,這將是您的所有其他類都可以繼承的模板類。模板類還包含ActiveRecord :: Base的所有屬性。

0

U可以通過從MyModule的去除before_destroy糾正這一點,並把它放在爲MyModel代替

before_destroy等回調僅適用於延伸的ActiveRecord :: Base的類,更多信息here

希望這有助於= )