ruby-on-rails 切换到Zeitwerk时未初始化的常量错误

mepcadol  于 5个月前  发布在  Ruby
关注(0)|答案(3)|浏览(70)

我目前在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

字符串
使用经典的代码加载器,这是没有问题的,但是当切换到Zeitwerk时,我在运行rails zeitwerk:check时得到一个NameError: uninitialized constant Importer::CustomImportJob错误。
我尝试将custom_import_job.rb移动到jobs目录,但仍然收到相同的错误。将app/jobs/importer添加到config.autoload_paths也没有帮助。
是文件结构有问题,还是我在Zeitwerk设置中遗漏了什么?

slhcrj9b

slhcrj9b1#

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

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

字符串
看来是这个问题的原因。现在它被删除了,一切都像预期的那样工作!

bejyjqdl

bejyjqdl2#

如果其他人也来这里,分享一些链接和上下文,我通过Rails故障排除指南在另一个答案中了解到:
https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#troubleshooting
我的Rails应用程序是在7.0上运行的,因此只有zeitwerk加载。https://guides.rubyonrails.org/classic_to_zeitwerk_howto.html#applications-running-rails-7
运行rails zeitwerk:check揭示了我在CI上看到的问题,但不是本地的,因为development.rb在这个项目中设置了config.eager_load = false
我的问题是我在lib下添加的一个文件,与application.rb中一些不推荐的config.eager_load_paths添加内容冲突。
为了解决这个问题,我把文件添加到lib的想法已经过时了,我应该把它添加到app/lib.https://stackoverflow.com/a/39024296/2506034下。然后,我不需要在我的问题文件中添加任何额外的require path/to/where/it/was/in/lib,这个常量是通过在app下自动加载的。

a64a0gku

a64a0gku3#

你可以看看你的app/jobs是否在路径中:

ActiveSupport::Dependencies.autoload_paths

字符串
如果需要,在config/application.rb中扩展config.autoload_paths
更多调试信息:https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#troubleshooting。

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

希望这些能帮上忙。

相关问题