我有2个型号:
Card belongs_to :template, optional: true
Template has_many :cards
我想在Card上添加回调:
before_save :set_status, if: self.template.exists?
但是这会引发Card类没有方法'模板'的错误吗?
我也尝试过:
before_save :set_status, if: self.attributes.has_key? "template_id"
和
before_save :set_status, if: self.template.nil?
(这也为#`)提供了NoMethodError (undefined method
模板')
和
before_save :set_status, if: self.template.present?
那么如何检查卡片是否有模板?
修改
这是有效的,但是为什么这样做而上面没有?似乎self.template必须在方法调用中。
before_save :set_status, if: :template_exists?
def template_exists?
return !self.template.nil?
end
答案 0 :(得分:2)
before_save :set_status, if: :template_exists?
def template_exists?
return !self.template.nil?
end
^此方法有效,因为回调需要它可以在运行时执行的代码。您可以向它传递一个映射到方法名称的符号或字符串,或者您可以将它传递给它可以在运行时执行的proc或lambda。但是如果你把代码传递给
before_save :set_status, if: self.template.nil?
然后它实际上会在您设置回调时尝试执行该代码,而不是在调用回调时执行。在设置回调时,self
引用类Card
而不是类的实例。
如果您需要更多详细信息,请参阅ActiveRecord callbacks上的一些文档。