Rails生产模式遇Zeitwerk错误:控制器常量不匹配的原因及解决
问题原因
开发模式下,Zeitwerk自动加载器为适配开发流程,容错性更强,不会严格校验文件路径与常量命名空间的对应关系;而生产模式下Zeitwerk会预加载所有应用常量,并严格遵循Rails的约定:文件路径必须与常量的命名空间完全对应。
- 按照规则,
app/controllers/masquerades_controller.rb应该定义顶级常量MasqueradesController - 但你的控制器定义的是命名空间嵌套的
Admin::MasqueradesController,与文件路径不匹配,生产模式预加载时就会触发Zeitwerk::NameError
解决方法
优先方案:遵循Rails约定调整文件路径
将控制器文件移动到与命名空间对应的目录下:
- 把
app/controllers/masquerades_controller.rb移至app/controllers/admin/masquerades_controller.rb - 同时确认路由配置中对该控制器的引用正确,比如devise_masquerade的路由需指向命名空间下的控制器:
devise_for :users, controllers: { masquerades: 'admin/masquerades' }
备选方案:手动配置Zeitwerk映射(不推荐)
如果特殊情况无法移动文件,可在config/application.rb中添加Zeitwerk的自定义映射,强制指定文件对应的常量:
Rails.autoloaders.main.inflector.inflect( "masquerades_controller" => "Admin::MasqueradesController" )
此方法会打破Rails的约定,增加后续维护成本,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

