我遇到了一个奇怪的问题,当父回调更新时,子回调不会被触发……
我有以下模型设置:
class Budget < ActiveRecord::Base
has_many :line_items
accepts_nested_attributes_for :line_items
end
class LineItem < ActiveRecord::Base
belongs_to :budget
before_save :update_totals
private
def update_totals
self.some_field = value
end
end
在我的表单中,我嵌套了字段(使用fields_for
构建):
= form_for @budget do |f|
= f.text_field :name
= f.fields_for :line_items do |ff|
= ff.text_field :amount
为什么孩子的update_totals
回调从来没有触发过/我该怎么做才能让它触发?
发布于 2012-07-20 19:02:12
我也有同样的问题。当模型不变时,不会调用before_save
回调。
您更新的是line_items
,而不是budget
,因此rails认为它没有更新,因此不会为它调用save
。
您需要将before_save
更改为after_validation
,以便即使模型没有更改属性也可以调用它。当您在此回调中更改某些属性时,rails将看到您的模型已更改,并将调用save
。
发布于 2014-02-05 09:09:47
这是个老问题,我知道,但它在搜索中仍然排在第一位。我认为这篇文章有一个解决方案:
Rails, nested attributes and before_save callbacks
如果我没理解错的话,问题(正如@AntonDieterle在他的回答中解释的那样)是子回调没有被触发,因为父回调不是“脏的”。这个圆弧的解决方案是通过在父属性上调用attr_name_will_change!
来“强制”它变脏,而这个父属性实际上是不变的。请参见Rails API2中的活动模型脏。
Anton使用after_validation
而不是before_save
的解决方案听起来更简单,但我想把它作为一种替代方案。
https://stackoverflow.com/questions/9358520
复制相似问题