升级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
相关产品推荐
相关产品推荐

