Подтвердить что ты не робот

Почему Rails не загружает классы из приложений/служб?

Я работаю над приложением Rails 4.2 и просто добавил app/services/fetch_artists.rb в структуру. Внутри этого файла я определил a class FetchArtists; end.

При попытке запустить rails r 'FetchArtists' он дает мне NameError: uninitialized constant FetchArtists.

Я пробовал смотреть ActiveSupport::Dependencies.autoload_paths и действительно, app/services не существует:

/.../app/assets
/.../app/controllers
/.../app/helpers
/.../app/jobs
/.../app/mailers
/.../app/models
/.../app/controllers/concerns
/.../app/models/concerns
/.../spec/mailers/previews

Мой вопрос: почему автоматическая загрузка этой папки и что мне делать для нее?

ИЗМЕНИТЬ

Очень странно, что после повторного запуска указанной команды с помощью rails runner новая папка появляется на пути автозагрузки. Я не знаю, почему это произошло с таким отставанием.

Кто-то предположил, что это может иметь дело с spring. Я хотел бы услышать больше об этом, так как он может помочь многим другим в этой ситуации.

4b9b3361

Ответ 1

Я столкнулся с той же проблемой и, похоже, проблема кэширования с Spring - процессом, который обрабатывает предварительную загрузку вашего приложения. Он используется для веб-сервера, а также для задач консоли и Rake.

Остановка Spring с помощью bin/spring stop заставит Spring загрузить новое приложение. Теперь запуск rails console и проверка ActiveSupport::Dependencies.autoload_paths будет успешно показывать app/services.

Ответ 2

У меня была аналогичная проблема, и я быстро взглянул на документы Spring и нашел этот бит о наблюдателях.

Я добавил следующее в мое приложение .rb, и все встало на свои места -

Spring.watch "app/services/**"

Я не эксперт здесь, ymmv.

Ответ 3

В моем случае spring не смотрел каталог app/services для изменений - перезагрузка spring загружала класс, но для изменения существующего класса или нового класса потребуется перезапуск spring для их применения.

Чтобы решить эту проблему, я добавил ее в список каталогов, просмотренных spring в config/spring.rb:

%w(
  .ruby-version
  .rbenv-vars
  tmp/restart.txt
  tmp/caching-dev.txt
  app/services
).each { |path| Spring.watch(path) }

и перезапустил spring еще раз.

Ответ 4

У меня была такая же проблема, и я не нашел решения. Я не достаточно терпелив, чтобы ждать загрузки автозагрузки, поэтому мое быстрое решение заключалось в том, чтобы включить eager_load и запустить мой сервер. Он, наконец, загрузит его. Затем я отключил его, и мои классы все еще были загружены.

Просто используйте: config.eager_load = true

в config/environments/development.rb

Ответ 5

Вы должны добавить его в autoload_paths

В config/application.rb:

config.autoload_paths += %W(#{config.root}/app/services)

Ответ 6

Вы должны включить его в autoload_paths:

config.autoload_paths += %W(#{Rails.root}/app/services)