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

Rails 7升级后遇Zeitwerk::NameError:模块命名致自动加载失败

Rails 7 Zeitwerk 自动加载问题解决(DW::Hospital 报错)

问题根源

你手动添加config.autoload_once_paths << 'app/models/dw'违反了Zeitwerk的命名映射规则——Zeitwerk会把你添加的这个路径当成根命名空间目录,所以它期望app/models/dw/hospital.rb定义Hospital常量,而不是DW::Hospital,这就是报错的直接原因。而且Zeitwerk默认会递归扫描app/models下的所有子目录,完全不需要手动配置这个路径。

解决步骤

  • 移除错误的加载路径配置:打开config/application.rb,删掉config.autoload_once_paths << 'app/models/dw'这一行。
  • 检查文件内的常量定义格式:确保app/models/dw/hospital.rb的代码符合Zeitwerk的要求,推荐用嵌套写法:
    module DW
      class Hospital < DataWarehouse
        # 你的类逻辑代码
      end
    end
    
    也可以用常量赋值写法,但嵌套写法更符合Rails规范:
    DW::Hospital = Class.new(DataWarehouse) do
      # 你的类逻辑代码
    end
    
    注意检查拼写:DW必须是大写(和目录名dw对应,下划线转驼峰),Hospital必须和文件名hospital.rb对应(下划线转驼峰)。
  • 确认父类DataWarehouse的加载:如果DataWarehouse定义在app/models/data_warehouse.rb,Zeitwerk会自动加载;如果在其他位置,确保它在DW::Hospital之前被加载(比如把父类文件放在更早被扫描的位置)。
  • 重启Rails服务器:Zeitwerk的配置变更需要重启服务器才能生效。

额外说明

Zeitwerk的核心规则是文件路径严格对应常量命名空间:

  • app/models/x.rb → X
  • app/models/x/y.rb → X::Y
  • app/models/x/y/z.rb → X::Y::Z
    只要遵循这个规则,不需要手动配置任何加载路径,Zeitwerk会自动完成所有类/模块的加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:30:41