Автозагрузка Rails 6 не обнаруживает класс

Я пытаюсь обновить Rails 5 до 6. Я выполнил шаги обновления, включая добавление этого:

# config/application.rb
config.load_defaults 6.0

У меня такой класс:

# lib/notification/auto_thank.rb
module Notification
  class AutoThank
    def perform
      # stuff
    end
  end
end

Что используется в задаче:

namespace :notify do
  task auto_thank: :environment do
    Notification::AutoThank.new.perform
  end
end

Когда я делаю puts config.autoload_paths, он указан в списке, поэтому я ожидаю его автозагрузки:

/my/app/path/lib/notification/auto_thank.rb

Но когда я запускаю задачу, я получаю сообщение об ошибке:

NameError: уведомление о неинициализированной константе

Становится еще более странным. Когда я добавляю требование к задаче:

task auto_thank: :environment do
  require '/my/app/path/lib/notification/auto_thank.rb'
  Notification::AutoThank.new.perform
end

У меня другая ошибка:

NameError: ожидаемый файл /my/app/path/lib/notification/auto_thank.rb для определения константы AutoThank, но не

Что мне не хватает?

1 ответ

Если можете, найдите свой код автозагрузки в app/. Начиная с Rails 6, все внутри автоматически становится частью пути автозагрузки. Rails 5 был более избирательным.

В этом случае назовите его: app/notifications/notification/auto_thank.rb

Первая часть пути игнорируется. Вторая (необязательная) часть - это пространство имен.

Обратите внимание: чтобы это отобразилось в автозагрузчике, вам может потребоваться остановить процесс Spring с помощью spring stop. Это необходимо делать каждый раз, когда вы вводите новыйapp/... дорожка.

Другие вопросы по тегам