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
。
参见:
我在 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
。
参见: