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的要求,推荐用嵌套写法:
也可以用常量赋值写法,但嵌套写法更符合Rails规范:module DW class Hospital < DataWarehouse # 你的类逻辑代码 end end
注意检查拼写:DW::Hospital = Class.new(DataWarehouse) do # 你的类逻辑代码 endDW必须是大写(和目录名dw对应,下划线转驼峰),Hospital必须和文件名hospital.rb对应(下划线转驼峰)。 - 确认父类
DataWarehouse的加载:如果DataWarehouse定义在app/models/data_warehouse.rb,Zeitwerk会自动加载;如果在其他位置,确保它在DW::Hospital之前被加载(比如把父类文件放在更早被扫描的位置)。 - 重启Rails服务器:Zeitwerk的配置变更需要重启服务器才能生效。
额外说明
Zeitwerk的核心规则是文件路径严格对应常量命名空间:
app/models/x.rb→Xapp/models/x/y.rb→X::Yapp/models/x/y/z.rb→X::Y::Z
只要遵循这个规则,不需要手动配置任何加载路径,Zeitwerk会自动完成所有类/模块的加载。
内容的提问来源于stack exchange,提问作者Dev V
相关产品推荐
相关产品推荐

