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!' 為に #

私は理解していません - 私のモデルの招待状には、モジュール Template から既にそのメソッドが含まれていたと思いませんか?

4

3 に答える 3

2

before_validation はブロックをインスタンスとして呼び出すため、sanitize_text はありません! なぜなら、sanitize_text! クラスメソッドです。

sanitize_text を定義してください! クラスメソッドとしてではなく、モジュール内で。

module Template
  ...
  def sanitize_text!
    # some stuff
  end
end
于 2012-05-15T11:13:15.263 に答える
0

それを行う方法では、のインスタンスではなく、Invitationメソッドを使用してクラスを拡張しています。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
于 2012-05-15T11:50:17.567 に答える
0

そのモデルの特定のインスタンスのメソッドとしてではなく、クラスメソッドとして含めました。

それを使用するには、次のように呼び出す必要があります。

Invitation.sanitize_text!

Invitationのインスタンスで呼び出すには、次の変更を行います。

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!
于 2012-05-15T11:18:25.057 に答える