You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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扩展

  1. 在项目根目录创建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
  1. 修改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
  1. 重新运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 05:12:37