Ruby on rails 正在尝试扩展ActiveRecord::Base';s save方法,但我得到;“所需类别或模块”;错误
这是我的AR模型: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 但我希望每次保存对象时都执行此代
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)
inContentSyntax
,您应该会很好。否则,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)
inContentSyntax
,您应该会很好。否则,include
将毫无意义,您必须说ContentSyntax.parse\u out\u variables(o.body)
。