如何为Devise配置Sorbet?ActiveRecord无法识别devise方法问题
Sorbet无法识别ActiveRecord模型中的Devise
devise方法的解决办法 问题场景
新创建的Rails应用集成Devise和Sorbet后,Sorbet对User模型中的devise方法报7003错误:
# typed: strict class User < ApplicationRecord # Method `devise` does not exist on `T.class_of(User)` (fix available)[7003] devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable end
虽然Devise在devise/lib/devise/orm/active_record.rb中通过ActiveSupport.on_load(:active_record)自动给ActiveRecord扩展了Devise::Models,但Sorbet扫描时并未加载这部分代码。手动在User类中添加extend Devise::Models可临时解决,但不符合自动化预期,且已尝试tapioca annotations、tapioca dsl、tapioca gem命令均无效。
原因分析
Tapioca扫描gem生成rbi文件时,并未触发Rails的完整初始化流程,导致Devise通过ActiveSupport.on_load(:active_record)注册的扩展逻辑未被执行,Sorbet因此无法识别devise方法。
解决步骤
方法一:让Tapioca加载Devise的ORM扩展
- 在项目根目录创建
lib/tapioca/helpers/devise_helper.rb:
# lib/tapioca/helpers/devise_helper.rb module Tapioca module Helpers module DeviseHelper def self.load_devise_orm require "devise/orm/active_record" end end end end
- 修改
tapioca/config.rb,添加前置加载逻辑:
# tapioca/config.rb require_relative "../lib/tapioca/helpers/devise_helper" Tapioca.configure do |config| config.before_gem_load do Tapioca::Helpers::DeviseHelper.load_devise_orm end end
- 重新运行Tapioca命令:
tapioca gem devise tapioca dsl tapioca annotations
方法二:手动补充RBI声明(快速方案)
如果方法一无效,可直接在sig/目录下创建补充的rbi文件,强制声明ActiveRecord的扩展:
# sig/active_record_devise.rbi # typed: true class ActiveRecord::Base extend Devise::Models end
之后重新运行srb tc检查,错误即可消失。
内容的提问来源于stack exchange,提问作者Ttauri
相关产品推荐
相关产品推荐

