web-dev-qa-db-fra.com

Pourquoi Rails ne charge-t-il pas automatiquement les classes depuis les applications / services?

Je travaille sur une application Rails 4.2 et je viens d'ajouter app/services/fetch_artists.rb à la structure. Dans ce fichier, j'ai défini un class FetchArtists; end.

Lorsque vous essayez d'exécuter Rails r 'FetchArtists' ça me donne un NameError: uninitialized constant FetchArtists.

J'ai essayé de regarder ActiveSupport::Dependencies.autoload_paths et en effet, app/services n'est pas là:

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

Ma question est la suivante: pourquoi ce dossier n'est-il pas automatiquement chargé et que dois-je faire pour qu'il soit?

MODIFIER

Très étrange, après avoir exécuté à plusieurs reprises la commande ci-dessus avec Rails runner, le nouveau dossier apparaît sur les chemins de chargement automatique. Je ne sais pas pourquoi cela s'est produit avec un tel décalage.

Quelqu'un a suggéré que cela pouvait concerner spring. J'aimerais en savoir plus à ce sujet, car cela peut aussi aider beaucoup d'autres personnes dans cette situation.

48
linkyndy

J'ai rencontré le même problème et il semble que ce soit un problème de mise en cache avec Spring, un processus qui gère le préchargement de votre application. Il est utilisé pour le serveur Web ainsi que pour les tâches de console et de râteau.

Arrêt du printemps avec bin/spring stop forcera Spring à charger votre application à nouveau. En cours d'exécution Rails console et inspection ActiveSupport::Dependencies.autoload_paths affichera avec succès app/services.

81
maknz

Dans mon cas, le printemps ne regardait pas le app/services répertoire des modifications - le redémarrage de Spring chargerait la classe, mais les modifications apportées à une classe existante ou à une nouvelle classe nécessiteraient un redémarrage de Spring pour qu'elles s'appliquent.

Pour résoudre ce problème, je l'ai ajouté à la liste des répertoires suivis par Spring dans config/spring.rb:

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

et redémarré Spring une fois de plus.

14
Brian

Je suis venu avec un problème similaire et j'ai jeté un rapide coup d'œil aux documents de printemps et j'ai trouvé ce bit sur observateurs .

J'ai ajouté ce qui suit à mon application.rb et les choses se sont mises en place -

Spring.watch "app/services/**"

Je ne suis pas un expert ici, ymmv.

12
sbauch

J'avais le même problème et je n'ai trouvé aucune solution. Je ne suis pas assez patient pour attendre le chargement automatique pour le charger, donc ma solution rapide a été d'activer eager_load et de démarrer mon serveur. Il va enfin le charger. Je l'ai éteint ensuite et mes cours étaient toujours chargés.

Utilisez simplement: config.eager_load = true

dans votre config/environments/development.rb

6
Daniel R Carletti