Ruby on rails 正在尝试扩展ActiveRecord::Base';s save方法,但我得到;“所需类别或模块”;错误

Ruby on rails 正在尝试扩展ActiveRecord::Base';s save方法,但我得到;“所需类别或模块”;错误,ruby-on-rails,inheritance,extends,Ruby On Rails,Inheritance,Extends,这是我的AR模型: class MyObject < ActiveRecord::Base include ContentSyntax # where parse_out_variables is defined serialize :variables def save self.variables = ContentSyntax.parse_out_variables(self.body) super end end 但我希望每次保存对象时都执行此代

这是我的AR模型:

class MyObject < ActiveRecord::Base
   include ContentSyntax # where parse_out_variables is defined
  serialize :variables
  def save
    self.variables = ContentSyntax.parse_out_variables(self.body)
    super
  end
end
但我希望每次保存对象时都执行此代码。(或者如果只更改了一个属性(“body”),那就更好了)

正确的方法是什么

编辑:

使用“保存前”回调:

  before_save {
    self.variables = ContentSyntax.parse_out_variables(self.body)
  }
我现在有一个错误:

NoMethodError (undefined method `body' for #<Class:0x10a0866b8>):
NoMethodError(未定义的#的“body”方法):

但是。。。它存在

在保存前使用
回调是正确的方法。但是,当您将块与ActiveRecord回调一起使用时,您可能需要类似以下内容:

before_save { |o| o.variables = o.parse_out_variables(o.body) }
或者可能是这样:

before_save :add_variables

private

def add_variables
    self.variables = parse_out_variables(self.body)
end

在保存前使用
回调是正确的方法。但是,当您将块与ActiveRecord回调一起使用时,您可能需要类似以下内容:

before_save { |o| o.variables = o.parse_out_variables(o.body) }
或者可能是这样:

before_save :add_variables

private

def add_variables
    self.variables = parse_out_variables(self.body)
end

您是否考虑过使用ActiveRecord回调(例如,在保存之前)来实现这一点,而不是覆盖保存?我没有,我正在研究这一点。第一次尝试:仅在保存之前将方法名称更改为
不起作用--同样的错误。您是否考虑过使用ActiveRecord回调(例如,在保存之前)来实现此功能,而不是覆盖保存?我没有,我现在正在研究。第一次尝试:只是在保存之前将方法名更改为
,没有效果——同样的错误。嘿,我在保存之前尝试过{o | o.variables=ContentSyntax.parse_out_variables(o.body)},但我仍然得到了所需的类或模块哦,我将ContentSyntax中的方法更改为静态,以帮助代码可读性这可能是我制作的模块的问题。虽然它在脚本/控制台中工作。所以,我不知道为什么它在这里不起作用。@TheLindyHop:
parse\u out\u variables
作为实例或类方法出现了吗?保存前的
:添加变量
版本是否有效?两个版本均无效。但是parse_out_变量是在像def self.parse_out_变量(文本)这样的内容语法中定义的。所以,我认为这是一个类/静态方法。@lindyhop:将其更改为
def parse\u out\u variables(text)
in
ContentSyntax
,您应该会很好。否则,
include
将毫无意义,您必须说
ContentSyntax.parse_out_variables(o.body)
。嘿,在保存{o|o.variables=ContentSyntax.parse_out_variables(o.body)}之前我试过了,但我仍然得到了所需的类或模块哦,我将ContentSyntax中的方法更改为静态,以帮助代码可读性这可能是我制作的模块的问题。虽然它在脚本/控制台中工作。所以,我不知道为什么它在这里不起作用。@TheLindyHop:
parse\u out\u variables
作为实例或类方法出现了吗?保存前的
:添加变量
版本是否有效?两个版本均无效。但是parse_out_变量是在像def self.parse_out_变量(文本)这样的内容语法中定义的。所以,我认为这是一个类/静态方法。@lindyhop:将其更改为
def parse\u out\u variables(text)
in
ContentSyntax
,您应该会很好。否则,
include
将毫无意义,您必须说
ContentSyntax.parse\u out\u variables(o.body)