我的控制器中有以下更新操作。我在这里面临的问题是,当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_save
或after_update
挂接期间,数据库中的对象尚未更新。当您从与事务相同的线程进行检查时,它似乎会更新。但是,该事务尚未提交。该交易是一个很好的设计决策,但它可能会导致after_save
或after_update
出现一些令人惊讶的行为
欲了解更多信息,请阅读这篇文章,并举例说明:https://flexport.engineering/how-to-safely-use-activerecords-after-save-efde2b52baa3
注意:-解决上述问题的快速方法是使用after_commit
而不是after_save
或after_update
。使用after_commit
可以保证数据库处于永久状态。