更新rails之前的after_update触发器事件



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

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可以保证数据库处于永久状态。

最新更新