提问人:SAKSHAM SHARMA 提问时间:7/11/2022 最后编辑:SAKSHAM SHARMA 更新时间:7/12/2022 访问量:436
Rails 7 中的意外回调行为
unexpected callbacks behaviour in rails 7
问:
我一直在尝试将我的代码库从 rails 5 迁移到 rails 7,但回调存在一些我无法弄清楚的问题
问题:
- 当多个回调(如 和)应该触发相同的方法时,表示该方法没有被调用。例如:
after_create_commit
after_update_commit
foo
after_create_commit :foo
after_update_commit :foo
但是当我稍微将语法更改为
after_create_commit -> { foo }
after_update_commit -> { foo }
- 如果在回调后要触发多个方法,则只调用最后一个方法,而不执行之前的所有方法,例如:
after_create_commit :foo1
after_create_commit :foo2
after_create_commit :foo3
这里只被执行,而 ,不被执行。foo3
foo1
foo2
有人可以解释这种行为吗,正确的解决方案是什么?
答:
3赞
sushant mittal
7/12/2022
#1
问题 1:
after_create_commit :foo
after_update_commit :foo
上面的代码将不起作用,因为我们不能在创建和更新时在回调中注册相同的方法。在这里,后一行覆盖了之前的注册,回调将仅在更新后运行。after_commit
after_update_commit
原因:
Rails 不会在内部维护单独的回调链。我们可以使用 method 检查回调链。create
update
__callbacks[:commit]
此外,下面的代码可以正常工作,因为这些是过程,它们将在回调链中注册为两个单独的过程。
after_create_commit -> { foo }
after_update_commit -> { foo }
问题 2:
after_create_commit :foo1
after_create_commit :foo2
after_create_commit :foo3
在这里,所有方法都应按顺序执行。但是,如果引发异常,则 和 不会执行。请发布您正在使用的确切代码。foo3, foo2, foo1
foo3
ActiveRecord::Rollback
foo2
foo1
评论
1赞
def avi
7/12/2022
回调指南中的此条目也非常相关:guides.rubyonrails.org/...
评论