Rails:来自模块的回调

wel*_*n97 5 module ruby-on-rails mixins

我试着这样做:

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

class MyModel <  ActiveRecord::Base
  include MyModule
  ...
end
Run Code Online (Sandbox Code Playgroud)

LIB/my_module.rb:

module MyModule
  before_destroy :my_func    #!

  def my_func
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

undefined method `before_destroy' for MyModule:Module
Run Code Online (Sandbox Code Playgroud)

我怎样才能纠正它.

我也是红宝石的新手.这些"属性"是什么类型:before_destroy,validates,has_many?它们是变量或方法还是什么?谢谢

ale*_*dev 14

before_destroy,validates等等不是属性或类似的东西.这些是方法调用.

在ruby中,类的主体是所有可执行代码,这意味着类主体的每一行都由interpeter执行,就像方法体一样.

before_destroy :my_func是一种通常的ruby方法调用.被调用的方法是before_destroy,它接收一个符号:my_func作为参数.在调用它的范围内的类(或模块)中查找此方法.

所以继续你的问题,我想现在你应该明白,当解释器加载你的模块

module MyModule
  before_destroy :my_func    #!

  def my_func
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

它开始执行它的主体并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
Run Code Online (Sandbox Code Playgroud)