wake-up-neo.net

Warum lädt Rails Klassen nicht automatisch von App / Services?

Ich arbeite an einer Rails 4.2 App und habe gerade app/services/fetch_artists.rb Zur Struktur hinzugefügt. In dieser Datei habe ich einen class FetchArtists; end Definiert.

Beim Versuch, Rails r 'FetchArtists' Auszuführen, erhalte ich einen NameError: uninitialized constant FetchArtists.

Ich habe versucht, ActiveSupport::Dependencies.autoload_paths Anzusehen, und tatsächlich ist app/services Nicht da:

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

Meine Frage ist, warum dieser Ordner nicht automatisch geladen wird und was ich dafür tun soll.

EDIT

Sehr seltsam, nachdem der obige Befehl wiederholt mit Rails runner Ausgeführt wurde, erscheint der neue Ordner in den Autoload-Pfaden. Ich habe keine Ahnung, warum dies mit einer solchen Verzögerung passiert ist.

Jemand schlug vor, dass dies mit spring zu tun haben könnte. Ich würde gerne mehr darüber erfahren, da dies möglicherweise auch vielen anderen in dieser Situation helfen kann.

48
linkyndy

Ich bin auf dasselbe Problem gestoßen und es scheint ein Caching-Problem mit Spring zu sein, einem Prozess, der das Vorladen Ihrer App behandelt. Es wird sowohl für den Webserver als auch für die Konsolen- und Rake-Aufgaben verwendet.

Wenn Sie Spring mit bin/spring stop Anhalten, wird Spring gezwungen, Ihre App neu zu laden. Wenn Sie nun Rails console Ausführen und ActiveSupport::Dependencies.autoload_paths Überprüfen, wird app/services Erfolgreich angezeigt.

81
maknz

In meinem Fall hat spring das Verzeichnis app/services Nicht auf Änderungen überwacht. Durch einen Neustart von Spring wird die Klasse geladen, Änderungen an einer vorhandenen Klasse oder einer neuen Klasse erfordern jedoch einen Neustart von Spring, damit sie übernommen werden.

Um dieses Problem zu beheben, habe ich es der Liste der von Spring überwachten Verzeichnisse in config/spring.rb Hinzugefügt:

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

und Spring noch einmal neu gestartet.

14
Brian

Ich kam mit einem ähnlichen Problem und warf einen kurzen Blick auf die Frühlingsdokumente und fand dieses Stück über Beobachter .

Ich fügte meiner application.rb Folgendes hinzu und die Dinge passten zusammen -

Spring.watch "app/services/**"

Ich bin hier kein Experte, ymmv.

12
sbauch

Ich hatte das gleiche Problem und fand keine Lösung. Ich habe nicht genug Geduld, um darauf zu warten, dass Autoload es irgendwann lädt. Daher bestand meine schnelle Lösung darin, eager_load einzuschalten und meinen Server zu starten. Es wird endlich geladen. Ich schaltete es danach aus und meine Klassen waren noch geladen.

Benutz einfach: config.eager_load = true

in deinem config/environments/development.rb

6