Автозагрузка 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/...
дорожка.