Rails 4.2.6中after_commit回调恢复时on: :create参数设置问题
解决Rails 4.2.6中恢复带
on: :create的after_commit回调问题 嘿,我在Rails 4.2版本里也踩过这个坑!你遇到的问题核心是:用skip_callback跳过带on限定的回调后,直接用set_callback恢复时,必须显式指定相同的on参数,否则回调会被绑定到所有commit事件(create/update/destroy),而不是原来仅创建的场景。
正确的恢复步骤
确认你的跳过语句:
你之前的跳过写法是没问题的:Order.skip_callback(:commit, :after, :create_report)这条语句会跳过所有绑定到
:commit事件的:create_report回调,不管原来的on限定是什么。关键:恢复时必须指定
on: :create
直接用Order.set_callback(:commit, :after, :create_report)是错误的,因为它会把回调重新绑定到所有commit操作。正确的写法是把on选项作为第四个参数传入:Order.set_callback(:commit, :after, :create_report, on: :create)
验证回调是否恢复正确
你可以在控制台里执行以下代码,检查回调的触发条件是否正确:
# 查看所有commit回调中与create_report相关的条目 Order._commit_callbacks.select { |c| c.filter == :create_report }.each do |callback| puts "回调触发时机: #{callback.options[:on]}" end
如果输出是回调触发时机: create,说明恢复成功了。
完整示例
# 模型中的回调定义 class Order < ActiveRecord::Base after_commit :create_report, on: :create private def create_report # 你的生成报告逻辑 end end # 跳过回调(比如测试场景中) Order.skip_callback(:commit, :after, :create_report) # 执行需要跳过回调的操作... # 恢复仅在create时触发的回调 Order.set_callback(:commit, :after, :create_report, on: :create)
内容的提问来源于stack exchange,提问作者Daniel Duque
相关产品推荐
相关产品推荐

