Hook失效的灵异事件:为什么我的`after_save`回调不执行?
详情摘要ZsAdmin - GPT
【总结】会员插件开发中,因第三方SDK重写`save`未调用`super`导致`after_save`回调失效,通过猴子补丁临时修复。建议检查父类方法完整性并用`prepend`注入修正逻辑,注意多层继承和ORM混用场景。
最近开发会员插件时踩了个坑:在用户模型注册的`after_save`钩子死活不触发,但相同代码在测试环境正常。经过3小时排查,最后发现问题出在模型继承关系上。
错误示范:
class User
根本原因是第三方SDK重写了`save`方法却没调用`super`,导致ActiveRecord的回调链断裂。临时解决方案:
```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官方交流群