rails 未初始化的常量模块名称

rails uninitialized constant Module Name

我在 app 目录下有一个 integrations 文件夹。 我可以看到此路径已加载

 ActiveSupport::Dependencies.autoload_paths
 "/appname/app/integrations"

然后在这个路径中我有另一个带有嵌套模块的文件夹

"/appname/app/integrations/moduleA/base_service.rb"
# frozen_string_literal: true

module Integrations
  module ModuleA
    class BaseService

但是当我尝试使用 class

Integrations::moduleA::BaseService
::Integrations::moduleA::BaseService

他们都给我

NameError: uninitialized constant Integrations

rails 自动加载器(经典和 Zeitwerk)的工作方式是 /app 文件夹的直接子目录是“根”目录。这意味着自动加载器将在所有这些目录中查找根级常量。

因此,如果您想定义 Foos::Bar,您需要将文件放在 app/foos/foos/bar.rb.

如果你想避免这种情况并将常量放在 app/integrations/module_a/base_service.rb 中,你需要将带有自定义命名空间的目录推送到 Zeitwerk:

loader.push_dir(Rails.root.join('app', 'integrations'), namespace: Integrations)

对于经典的自动加载器,解决方案是将 /app 文件夹也作为根目录添加到 autoloading/eager_loading 路径。

config.autoload_paths += %W(#{config.root}/app)

以便自动加载器将在 app/integrations/module_a.rb 中查找 Integrations::ModuleA

参见: