Не удается автоматически загрузить класс в 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

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