0

好吧,偶然发现了这个奇怪的东西。我的用户模型中有这个。

after_create :assign_role, :subscribe_to_basic_plan

  def assign_role
    self.role = 1
    self.save
  end

  def subscribe_to_basic_plan
    self.customer_id = "hello"
    self.save
  end

(出于说明目的简化了代码)

当我创建我的用户并在控制台中检查它时,我得到role: 1, customer_id: nil. 但是!,如果我从第一个回调中删除保存一切正常。

  after_create :assign_role, :subscribe_to_basic_plan

  def assign_role
    self.role = 1
  end

  def subscribe_to_basic_plan
    self.customer_id = "hello"
    self.save
  end

产生role: 1, customer_id: "hello". 所以似乎它只读取.save回调中的第一个。我想了解确切的行为是什么以及为什么。我花了很多时间试图查明这一点,并且不想再次偶然发现类似的东西。

编辑:

也许这很有帮助。当我使用 self.save 时!在subscribe_to_basic_plan我得到一个错误,记录根本没有保存。放入assign_roleself.save!不会改变任何东西,所以问题肯定出在第二个.save.

4

1 回答 1

1

这个答案是理论上的,因为我需要查看完整的模型代码才能确定。

由于某种原因,您在 assign_role 中的第一次保存很可能失败。当它失败并返回 fall 时,会导致 rails 跳过它之后的所有回调。然后你的第二个回调根本不会运行。

按我喜欢的顺序可能的解决方案:

  • 不要使用回调。在保存模型之前让您的控制器设置这些值。
  • 使用 before_create 这样您就不会连续保存 3 次完全相同的模型。
  • 将您的两个回调合并为一个回调,只需一次保存。
  • 使用 save(validate: false) 保存,以防验证失败。
于 2017-05-08T16:34:01.600 回答