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

升级Rails 7后引入Concern模块时出现未初始化常量错误

Rails 7升级后Concern模块加载失败的解决方法

问题原因

Rails 7默认使用Zeitwerk作为自动加载器,它在嵌套命名空间类中解析常量时,会优先在当前类的命名空间下查找。因此API::V2::BaseController中直接写include UserApiAccessRecorder时,Zeitwerk会先尝试查找API::V2::BaseController::UserApiAccessRecorder,而非直接定位顶级命名空间的模块,导致找不到常量报错。

解决步骤

1. 显式指定顶级命名空间

修改控制器代码,在模块名前添加::前缀,强制Zeitwerk加载顶级命名空间的模块:

# app/controllers/api/v2/base_controller.rb
class API::V2::BaseController < ActionController::Base
  include ::UserApiAccessRecorder
end

2. 确认Concerns目录的自动加载配置

检查config/application.rb,确保app/controllers/concerns已被加入自动加载路径(Rails 7默认已配置,若有自定义配置可验证):

# config/application.rb
config.autoload_paths << Rails.root.join('app', 'controllers', 'concerns')

3. 清除缓存并重启服务

执行命令清除Rails缓存,避免旧缓存干扰加载:

rails tmp:clear

之后重启服务器,确保配置生效。

4. 验证文件名与常量名匹配

确认user_api_access_recorder.rb的文件名与常量UserApiAccessRecorder符合蛇形命名转大驼峰的规则,此规则是Zeitwerk自动加载的核心要求,当前代码已符合该规则。

内容的提问来源于stack exchange,提问作者tomwang1013

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:22:07