after_update 更新前触发事件 rails

after_update trigger event before update rails

我的控制器中有以下更新操作。我在这里面临的问题是,我想在 accepted_offer_letter 为真时向用户发送电子邮件。在更新操作中,我将 accepted_offer_letter 更新为 true。但我在这里面临的问题是 send_offer_email 运行,但如果我检查 accepted_offer_letter 的值,它仍然 return false 由于发送了电子邮件。但是在控制台中我检查了 accepted_offer_letter 是真的。请帮我找出我哪里出错了。

accepted_offer_letter: true

users_controller.rb

def update
 ActiveRecord::Base.transaction do
  @user_params = user_params
  @user = current_user
  @user.assign_attributes(@user_params)
  if @user.finalize_change
    generate_offer_letter
  end
  render json: { errors: @user.errors.full_messages }, status: :unprocessable_entity unless @user.save
  end
end


private
def generate_offer_letter
 @user.assign_attributes(accepted_offer_letter: true)
end

user.rb 型号

after_update: send_letter


def send_offer_email
 binding.pry_remote
 if accepted_offer_letter
  UserMailer.send_offer_letter(id).deliver_now
 end
end

这是因为 ActiveRecord 的事务块

after_saveafter_update 挂钩期间,数据库中的对象尚未更新。当您从与交易相同的线程进行检查时,它似乎已更新。但是,事务尚未提交。交易是一个很棒的设计决策,但它可能会导致 after_saveafter_update

的一些令人惊讶的行为

有关更多信息,请阅读这篇用很好的例子进行解释的文章:https://flexport.engineering/how-to-safely-use-activerecords-after-save-efde2b52baa3

注意:- 上述问题的快速修复是使用 after_commit 而不是 after_saveafter_update。使用 after_commit 保证您将拥有数据库的永久状态。