首页 > 解决方案 > Rails 自动加载嵌套类:LoadError(无法自动加载常量 ModuleName::ClassName)

问题描述

app/services用来组织服务类的集合。例如,我对app/services/metrics/transaction.rb.

出于某种原因,Rails 自动加载很难做到这一点。我会收到不断的加载错误,例如:

LoadError (Unable to autoload constant Metrics::Transaction, expected /Users/home/company/repo-name/app/services/metrics/transaction.rb to define it)

当然,文件(和它的 3 个同级文件)是在列出的位置定义的。在急切加载常量的生产环境中,这不是问题。

路径在下面app,我检查了自动加载路径,因此应该加载文件,但是每当第一次命中常量时,我​​都会遇到这个问题。

标签: ruby-on-railsactivesupportruby-on-rails-6

解决方案


这里的关键似乎是常量是嵌套的。似乎常量加载器首先尝试加载模块Metrics并且未能找到,发出错误。

如果您在app/services(或任何相应的app/*自动加载目录)中创建一个定义模块常量的文件:

# app/services/metrics.rb
module Metrics
end

那么自动加载器将能够干净地加载app/services/metrics/*.


推荐阅读