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.
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.
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.
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.
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