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