Rails堆栈级别太深使用after_update方法

时间:2017-05-05 05:16:00

标签: ruby-on-rails

我试图这样做,以便当用户更改两个布尔变量(buyerseller中的任何一个时,可以在任一方向更改它们以触发操作)它将将第三个变量status_confirmed的状态重置为false

我的user模型中有以下内容:

after_update :reset_confirmed

  def reset_confirmed
    if self.buyer_changed? || self.seller_changed?
      self.update_attributes(status_confirmed: false)
    end
  end

从我能理解的stack level too deep错误是由无限循环或递归引起的,我无法找到。谁能看到我出错的地方?

1 个答案:

答案 0 :(得分:6)

处理此问题的两种方法:

after_update :reset_confirmed
def reset_confirmed
  self.update_column(:status_confirmed, false) if self.buyer_changed? || self.seller_changed?
end

update_attributeupdate_column之间的区别对您有帮助,因为后者skips回调(如果有的话)。

OR

before_save  :reset_confirmed
def reset_confirmed
  self.status_confirmed = false if self.buyer_changed? || self.seller_changed?
end

在这里,您只需在将值保存到db之前指定一个值,所以......

希望有所帮助......