Ik werk aan een Rails 4.2-app en heb zojuist app/services/fetch_artists.rb
aan de structuur toegevoegd. Binnen dit bestand heb ik een class FetchArtists; end
.
Als ik probeer rails r 'FetchArtists'
uit te voeren, krijg ik een NameError: uninitialized constant FetchArtists
.
Ik heb geprobeerd te kijken naar ActiveSupport::Dependencies.autoload_paths
en inderdaad, app/services
is er niet:
/.../app/assets
/.../app/controllers
/.../app/helpers
/.../app/jobs
/.../app/mailers
/.../app/models
/.../app/controllers/concerns
/.../app/models/concerns
/.../spec/mailers/previews
Mijn vraag is, waarom wordt deze map niet automatisch geladen, en wat moet ik daarvoor doen?
BEWERKEN
Heel vreemd, na het herhaaldelijk uitvoeren van het bovenstaande commando met rails runner
, verschijnt de nieuwe map op de autoload-paden. Ik heb geen idee waarom dit met zo’n vertraging is gebeurd.
Iemand suggereerde dat dit te maken zou kunnen hebben met spring
. Ik zou hier graag meer over horen, omdat het mogelijk ook vele anderen in deze situatie kan helpen.
Antwoord 1, autoriteit 100%
Ik kwam hetzelfde probleem tegen en het lijkt een caching-probleem te zijn met Spring, een proces dat het voorladen van je app afhandelt. Het wordt gebruikt voor zowel de webserver als de console en Rake-taken.
Als je Spring stopt met bin/spring stop
, wordt Spring gedwongen je app vers te laden. Nu rails console
wordt uitgevoerd en ActiveSupport::Dependencies.autoload_paths
wordt geïnspecteerd, wordt app/services
weergegeven.
Antwoord 2, autoriteit 23%
In mijn geval keek Spring niet naar de app/services
directory voor wijzigingen – het herstarten van Spring zou de klasse laden, maar wijzigingen aan een bestaande klasse of nieuwe klasse zouden een herstart van Spring vereisen om ze toe te passen .
Om dit probleem op te lossen heb ik het toegevoegd aan de lijst met door Spring bekeken mappen in config/spring.rb
:
%w(
.ruby-version
.rbenv-vars
tmp/restart.txt
tmp/caching-dev.txt
app/services
).each { |path| Spring.watch(path) }
en startte Spring nog een keer.
Antwoord 3, autoriteit 11%
Ik kwam met een soortgelijk probleem en wierp een snelle blik op de Spring-documenten en vond dit stukje over kijkers.
Ik heb het volgende toegevoegd aan mijn application.rb en alles viel op zijn plaats –
Spring.watch "app/services/**"
Ik ben hier geen expert, ymmv.
Antwoord 4, autoriteit 11%
Ik had hetzelfde probleem en vond geen oplossing. Ik ben niet geduldig genoeg om te wachten op autoload om het uiteindelijk te laden, dus mijn snelle oplossing was om gretig_load aan te zetten en mijn server te starten. Het zal het eindelijk laden. Ik heb het daarna uitgezet en mijn lessen waren nog steeds geladen.
Gebruik gewoon:
config.eager_load = true
in uw config/environments/development.rb
Antwoord 5
Je moet het opnemen in autoload_paths
:
config.autoload_paths += %W(#{Rails.root}/app/services)