切换到 Zeitwerk 时出现未初始化的恒定错误

Ahm*_*man 6 ruby-on-rails zeitwerk

目前我的目录中有以下文件jobs

# app/jobs/importer.rb
module Imporer
  def self.valid_importers
    # Do stuff
  end
end

# app/jobs/importer/custom_import_job.rb
class Importer::CustomImportJob < ApplicationJob
  def perform
    # Do stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

使用经典代码加载器可以正常工作,但是当切换到 Zeitwerk 时,我NameError: uninitialized constant Importer::CustomImportJob在运行rails zeitwerk:check.

我尝试移动custom_import_job.rb到该jobs目录,但仍然收到相同的错误。添加app/jobs/importerconfig.autoload_paths没有帮助。

文件结构是否有问题,或者我在 Zeitwerk 设置中遗漏了某些内容?

Ahm*_*man 6

经过一番挖掘后,我意识到我有以下内容development.rb

Dir[Rails.root.join('app/jobs/importer/*.rb')].each { |f| require f }
Run Code Online (Sandbox Code Playgroud)

看来这就是问题的原因。现在它已被删除,一切都按预期工作!

  • 我的猜测是,手动“require”干扰了 Zeitwerk 自动加载文件的方式,这导致了我遇到的问题。如果文件不在自动加载的文件夹中,这可能不会有问题。 (3认同)

Jua*_*tas 1

您可以看看您的应用程序/工作是否在路径中:

ActiveSupport::Dependencies.autoload_paths
Run Code Online (Sandbox Code Playgroud)

如有必要,可通过config.autoload_pathsin进行延长。config/application.rb

更多调试信息:https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#troubleshooting

  • 停止春天。重新启动服务器。也可能有帮助。

希望这些有帮助。