2012-05-15 69 views
1

可以說我有這個模塊:多態性模型和模塊

module Template 

def self.included(base) 

    base.class_eval do 
     before_validation(:on => :create) { sanitize_text! } 
    end 

    base.extend(ClassMethods) 
end 

module ClassMethods 

    def sanitize_text! 
    # some stuff 
    end 

end 

end 

然後,我已經定義,像這樣一個模型:

class Invitation < ActiveRecord::Base 
    include Template 
end 

請注意,我沒有覆蓋的方法sanitize_text!但是當我跑過這個Rails會給我一個錯誤:

未定義的方法`sanitize_text!'爲#

我不明白 - 是不是假設我的模型邀請已經包括該模塊模板的方法已經?

回答

2

before_validation將該塊作爲實例調用,因此沒有sanitize_text!因爲sanitize_text!是一種類方法。

Define sanitize_text!在模塊中,不是作爲類方法。

module Template 
    ... 
    def sanitize_text! 
    # some stuff 
    end 
end 
0

你已經包括它作爲一個類方法,還不如在該模型的任何特定實例的方法。

要使用你需要調用它像:

Invitation.sanitize_text! 

要調用它邀請的情況下,進行這些更改:

module Template 

def self.included(base) 

    base.class_eval do 
     before_validation(:on => :create) { sanitize_text! } 
    end 

    base.extend(ClassMethods) 
end 

def sanitize_text! 
    # some stuff 
end 

module ClassMethods 
end 

end 

然後你就可以把它在一個特定的方法:

@invitation.sanitize_text! 
0

你這樣做的方式你擴展Invitation class with met hod sanitize_text!,而不是Invitation的實例。

如果你想實例有sanitize_text!,你最好重新命名ClassMethodsInstanceMethods,改變self.included有這樣一行:

base.send :include, InstanceMethods 

所以整個代碼是這樣的:

module Template 
    def self.included(base) 
    base.class_eval do 
     before_validation(:on => :create) { sanitize_text! } 
    end 

    base.send :include, InstanceMethods 
    end 

    module InstanceMethods 
    def sanitize_text! 
     # method body 
    end 
    end 
end