Ruby on rails Rails嵌套属性子回调不是';不要开枪
我遇到了一个奇怪的问题,当父对象更新时,不会触发子对象回调 我有以下模型设置:Ruby on rails Rails嵌套属性子回调不是';不要开枪,ruby-on-rails,activerecord,callback,nested-attributes,Ruby On Rails,Activerecord,Callback,Nested Attributes,我遇到了一个奇怪的问题,当父对象更新时,不会触发子对象回调 我有以下模型设置: class Budget < ActiveRecord::Base has_many :line_items accepts_nested_attributes_for :line_items end 为什么孩子的update\u totals回调从未被触发/我能做些什么让它触发?我也有同样的问题保存前当模型未更改时,不会调用回调 您正在更新的是行项目,而不是预算,因此rails认为它没有更新,并且没
class Budget < ActiveRecord::Base
has_many :line_items
accepts_nested_attributes_for :line_items
end
为什么孩子的
update\u totals
回调从未被触发/我能做些什么让它触发?我也有同样的问题<代码>保存前当模型未更改时,不会调用回调
您正在更新的是行项目
,而不是预算
,因此rails认为它没有更新,并且没有为它调用保存
您需要将保存前的
更改为验证后的,这样即使模型的属性没有更改,也会调用它。当您在这个回调中更改一些属性时,rails将看到您的模型已经更改,并将调用save
旧问题,我知道,但它仍然在搜索中首先出现。我认为本文有一个解决方案:
如果我正确理解了那篇文章,那么问题(正如@antonditerle在他的回答中所解释的)在于子回调不会被触发,因为父回调不是“脏的”。这篇文章的解决方案是通过调用attr\u name\u will\u change来“强制”它脏的实际上不会更改的父属性上的代码>。请参阅Rails API中的[Active Model Dirty]
安东的解决方案是在验证之后使用,而不是在保存之前使用,这听起来更简单,但我想把它作为一个替代方案。谢谢,@Nico将其从答案中删除。出于某种原因,我认为它应该触发回调。我在保存后也有同样的问题,即使验证失败,我应该做什么@nicobots after\u validation每次都会触发回调?而在“只有通过验证才能保存火灾”之前?@weexpected这一点我不确定,也许你是对的。但是您可以将if::valid?
添加到after\u validation
回调中,在这种情况下,在after\u validation方法中,我添加的第一行是:return if errors.any?我构建了一个小样本应用程序,无法重现您的问题。您确定没有触发回调吗?确保的最简单方法是在方法内部引发异常。如果引发了异常,那么我们知道回调正在被触发,因此回调代码中可能存在缺陷,而不是回调本身。我是肯定的。我没有使用异常,我使用了put
语句,但是开发日志中没有显示任何内容,即使使用put
我仍然能够在我自己的开发日志中看到输出。工作中肯定还有其他问题,但我需要更多地了解您的应用程序,以了解问题所在。您是否找到解决方案?没有…:(.我最后只是写了一堆奇怪的回电,总是很高兴看到你答案的链接。谢谢。WayBackMachine来营救!试试看
class LineItem < ActiveRecord::Base
belongs_to :budget
before_save :update_totals
private
def update_totals
self.some_field = value
end
end
= form_for @budget do |f|
= f.text_field :name
= f.fields_for :line_items do |ff|
= ff.text_field :amount