Hook失效的灵异事件:为什么我的`after_save`回调不执行?
最近开发会员插件时踩了个坑:在用户模型注册的`after_save`钩子死活不触发,但相同代码在测试环境正常。经过3小时排查,最后发现问题出在模型继承关系上。
错误示范:
class User < ThirdParty::OauthModel
after_save :sync_member_level
def sync_member_level
# 永远执行不到这里
end
end
```</p>
<p>根本原因是第三方SDK重写了`save`方法却没调用`super`,导致ActiveRecord的回调链断裂。临时解决方案:</p>
```ruby
# 猴子补丁修正父类方法
ThirdParty::OauthModel.class_eval do
def save(*args)
super.tap do |result|
run_callbacks(:save) if result
end
end
end
更健壮的方案应该是:
1. 通过`method_defined?`检查父类方法完整性2. 使用`prepend`方式注入修正逻辑
3. 在插件文档明确标注继承要求
这种隐蔽问题尤其容易出现在:
- 多层继承的模型
- 混用不同ORM框架
- 重写了`save/create/update`等关键方法
最新打赏


QQ官方交流群