如何为Rails Engine创建Tapioca Shim解决Sorbet类型报错?
解决Rails Engine中Sorbet报错
root.to_s方法不存在的问题 问题原因
Sorbet的Rails RBI定义里,Rails::Engine的root属性未被正确标注类型(该属性属于动态生成的属性,Sorbet无法自动识别),导致开启# typed: strict后触发root.to_s方法不存在的错误。借助Tapioca的shim机制,可以手动补充缺失的类型定义来修正这个问题。
具体解决步骤
创建/定位Tapioca Shim目录
确保项目中存在sorbet/shims目录,若不存在则直接创建:mkdir -p sorbet/shims编写Rails::Engine的类型补全Shim
在sorbet/shims目录下新建rails_engine_root.rbi文件,内容如下:# typed: true class Rails::Engine # 明确root属性为Pathname类型,该类型自带to_s方法 sig { returns(Pathname) } attr_reader :root end验证修复效果
重新运行Sorbet类型检查:srb tc此时将你的
engine.rb设置为# typed: strict后,root.to_s的报错应该消失。(可选)避免Shim被Tapioca覆盖
如果后续运行tapioca命令时shim被覆盖,可在tapioca/config.yml中将该shim加入保留列表:shims: keep: - sorbet/shims/rails_engine_root.rbi
补充说明
你的engine.rb中root是Rails Engine的核心属性,本质为Pathname实例,通过shim明确类型后,Sorbet就能正确识别to_s方法的调用。这种方法也适用于其他类似的动态属性类型缺失问题。
内容的提问来源于stack exchange,提问作者mrcasals
相关产品推荐
相关产品推荐

