Не удается автоматически загрузить класс в Rails6
Я хочу добавить собственный класс в папку приложения в чистый проект Rails 6, ruby 2.7.0. Согласно документации Zeitwerk, он должен автоматически загружать все пути в каталоге приложения.
app/custom/car.rb
class Car
def self.print
print 'Car'
end
end
Я получаю ошибку в консоли рельсов
2.7.0 :001 > Car.print
NameError (uninitialized constant Car)
Что случилось?
Примечание: когда я помещаю car.rb в app/ models, он работает нормально, но не внутри каталога app/ custom.
1 ответ
Вероятно, ваша проблема связана не с загрузчиком Zeitwerk, а с предварительным загрузчиком Spring, который запускается по умолчанию - https://guides.rubyonrails.org/autoloading_and_reloading_constants.html отмечает, что "По умолчанию пути автозагрузки приложения состоят из всех подкаталогов приложения, которые существуют при загрузке приложения "
Это примечание "когда приложение загружается" очень важно - с пружиной в игре, если вы добавляете папку в/app
и Spring уже запущен, вам придется перезапустить предварительный загрузчик Spring, чтобы перезагрузить приложение в фоновом режиме, чтобы Zeitwerk его подхватил.
bundle exec spring status
покажет вам статус весеннего прелоадера, и вы можете использовать bundle exec spring stop
чтобы остановить его и принудительно перезагрузить в следующий раз, когда вы запустите команду, которая будет использовать его как rails console