ruby-on-rails autoload ruby-on-rails-4.2

ruby on rails - ¿Por qué Rails no carga automáticamente las clases desde la aplicación/servicios?



ruby-on-rails autoload (6)

Deberías incluirlo en autoload_paths :

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

Estoy trabajando en una aplicación de Rails 4.2 y acabo de agregar una app/services/fetch_artists.rb a la estructura. Dentro de este archivo, he definido una class FetchArtists; end class FetchArtists; end

Cuando intento ejecutar rails r ''FetchArtists'' , me da NameError: uninitialized constant FetchArtists .

He intentado buscar en ActiveSupport::Dependencies.autoload_paths y, de hecho, la app/services no está allí:

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

Mi pregunta es, ¿por qué esta carpeta no se carga automáticamente y qué debo hacer para que esté?

EDITAR

Muy extraño, después de ejecutar repetidamente el comando anterior con rails runner , aparece la nueva carpeta en las rutas de autocarga. No tengo idea de por qué sucedió esto con un retraso tan grande.

Alguien sugirió que esto podría tratar con la spring . Me gustaría escuchar más sobre esto, ya que posiblemente pueda ayudar a muchos otros en esta situación también.


En mi caso, la primavera no estaba mirando el directorio de la app/services busca de cambios: reiniciar Spring cargaría la clase, pero los cambios en una clase existente o una nueva clase requerirían un reinicio de Spring para que se apliquen.

Para resolver este problema, lo agregué a la lista de directorios observados por Spring en config/spring.rb :

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

y reinició Spring una vez más.


Estaba teniendo el mismo problema y no encontré ninguna solución. No soy lo suficientemente paciente como para esperar a que se cargue automáticamente, así que mi solución rápida fue encender eager_load e iniciar mi servidor. Finalmente lo cargará. Lo apagué después y mis clases seguían cargadas.

Solo use: config.eager_load = true

en su config/environments/development.rb


Llegué con un problema similar, eché un vistazo rápido a los documentos de Spring y encontré este bit sobre los watchers .

Agregué lo siguiente a mi application.rb y las cosas encajaron en su lugar:

Spring.watch "app/services/**"

No soy un experto aquí, ymmv.


Me encontré con el mismo problema y parece ser un problema de almacenamiento en caché con Spring, un proceso que maneja la precarga de su aplicación. Se usa para el servidor web, así como para las tareas de consola y Rake.

Detener el resorte con un bin/spring stop forzará al resorte a cargar su aplicación de nuevo. Ahora ejecutando la rails console e inspeccionando ActiveSupport::Dependencies.autoload_paths mostrará la app/services éxito.


Tienes que añadirlo a las autoload_paths

En config / application.rb :

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