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_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
保证您将拥有数据库的永久状态。
我的控制器中有以下更新操作。我在这里面临的问题是,我想在 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_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
保证您将拥有数据库的永久状态。