Error 5067问题:如何绕过该错误并在项目中实现Sorbet?
解决Sorbet检测rails-observers时的父类类型错误
问题根源
Sorbet自动生成的sorbet/rbi/todo.rbi文件错误地将ActiveRecord::Observer定义为module,但实际上它是一个继承自ActiveRecord::Base的类,这直接导致你的SupplierObserver继承时触发类型检测错误。
可行解决方案
1. 手动修正RBI定义(推荐长期方案)
- 打开
sorbet/rbi/todo.rbi,删除该行:module ActiveRecord::Observer; end - 新建或编辑
sorbet/rbi/rails-observers.rbi,添加正确的类定义:
这样Sorbet就能正确识别class ActiveRecord::Observer < ActiveRecord::Base # 按需添加Observer的核心方法签名,示例: def self.observe(*models); end def after_create(record); end def after_update(record); end def after_destroy(record); end endActiveRecord::Observer作为合法父类。
2. 临时跳过单个文件检测
如果暂时不想维护RBI文件,可以在app/models/supplier_observer.rb顶部添加Sorbet指令,跳过该文件的类型检测:
# typed: ignore
注意:这只是临时 workaround,不建议长期使用。
3. 强制Tapioca生成正确RBI(并避免被覆盖)
- 先删除旧的todo.rbi:
rm sorbet/rbi/todo.rbi - 重新运行Tapioca生成gem RBI:
tapioca gems - 如果Tapioca仍错误生成module定义,手动覆盖为正确的类定义后,在
tapioca/config.yml中添加排除规则,防止自定义RBI被覆盖:exclude: - sorbet/rbi/rails-observers.rbi
内容的提问来源于stack exchange,提问作者Jean Pierry S Mendonça
相关产品推荐
相关产品推荐

