Ruby on rails Rails:来自模块的回调

Ruby on rails Rails:来自模块的回调,ruby-on-rails,module,mixins,Ruby On Rails,Module,Mixins,我尝试这样做: app/models/my_model.rb: class MyModel < ActiveRecord::Base include MyModule ... end 但我有一个错误: undefined method `before_destroy' for MyModule:Module 我怎样才能改正呢 而且我对ruby还是新手。什么类型有这些“属性”:在销毁、验证之前,有多少? 它们是变量还是方法还是什么? 感谢lib/my_module.rb中的,请

我尝试这样做:

app/models/my_model.rb:

class MyModel <  ActiveRecord::Base
  include MyModule
  ...
end
但我有一个错误:

undefined method `before_destroy' for MyModule:Module
我怎样才能改正呢

而且我对ruby还是新手。什么类型有这些“属性”:在销毁、验证之前,有多少? 它们是变量还是方法还是什么?
感谢lib/my_module.rb中的,请执行以下操作:

class MyInheritedClass < ActiveRecord::Base before_destroy :my_func def my_func ... end end class MyModel < MyInheritedClass ... end 类MyInheritedClass class MyInheritedClass < ActiveRecord::Base before_destroy :my_func def my_func ... end end class MyModel < MyInheritedClass ... end 类MyModel您试图在上面创建的模块中没有before_destroy筛选器。我的代码所做的是创建一个从ActiveRecord::Base继承的类,该类将是所有其他类都可以继承的模板类。template类还包含ActiveRecord::Base的所有属性。

您可以在销毁MyModule之前将其删除,然后将其放在MyModel中,从而更正此问题

在销毁和其他回调仅对扩展ActiveRecord::Base的类可用之前,请参阅更多信息


希望这有帮助。=)

在销毁之前,
验证等都不是属性或类似的东西。这些是方法调用

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

销毁之前的
:my\u func
是一个常见的ruby方法调用。被调用的方法是_destroy
之前的
,它接收一个符号
:my_func
作为参数。在调用该方法的范围内的类(或模块)中查找该方法

接下来是你的问题,我想现在你应该明白当解释器加载你的模块时

module MyModule
  before_destroy :my_func    #!

  def my_func
    ...
  end
end
它开始执行其主体,并在该模块中的\u 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