Waarom laadt Rails klassen niet automatisch van app/services?

Ik werk aan een Rails 4.2-app en heb zojuist app/services/fetch_artists.rbaan 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_pathsen inderdaad, app/servicesis 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 consolewordt uitgevoerd en ActiveSupport::Dependencies.autoload_pathswordt geïnspecteerd, wordt app/servicesweergegeven.


Antwoord 2, autoriteit 23%

In mijn geval keek Spring niet naar de app/servicesdirectory 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)

Other episodes