Why doesn't Rails autoload classes from app/services?

29,566

Solution 1

I encountered the same problem and it seems to be a caching issue with Spring, a process which handles preloading your app. It's used for the web server as well as the console and Rake tasks.

Stopping Spring with bin/spring stop will force Spring to load your app fresh. Now running rails console and inspecting ActiveSupport::Dependencies.autoload_paths will successfully show app/services.

Solution 2

In my case spring was not watching the app/services directory for changes - restarting Spring would load the class but changes to an existing class or new class would require a restart of Spring for them to apply.

To resolve this issue I added it to the list of directories watched by Spring in config/spring.rb:

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

and restarted Spring one more time.

Solution 3

I came with a similar problem, and took a quick glance at the Spring docs and found this bit about watchers.

I added the following to my application.rb and things fell into place -

Spring.watch "app/services/**"

I'm no expert here, ymmv.

Solution 4

I was having the same problem, and found no solution. I'm not patient enough to wait for autoload to load it eventually, so my quick solution was to turn eager_load on, and start my server. It will finally load it. I switched it off afterwards and my classes were still loaded.

Just use: config.eager_load = true

in your config/environments/development.rb

Share:
29,566
linkyndy
Author by

linkyndy

Passionate about everything web-related. Love cycling, snooker, swimming and traveling.

Updated on July 27, 2022

Comments

  • linkyndy
    linkyndy almost 2 years

    I'm working on a Rails 4.2 app and have just added app/services/fetch_artists.rb to the structure. Inside this file, I have defined a class FetchArtists; end.

    When trying to run rails r 'FetchArtists' it gives me a NameError: uninitialized constant FetchArtists.

    I've tried looking at ActiveSupport::Dependencies.autoload_paths and indeed, app/services is not there:

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

    My question is, why isn't this folder automatically loaded, and what should I do for it to be?

    EDIT

    Very strange, after repeatedly running the above command with rails runner, the new folder appears on the autoload paths. I have no idea why this happened with such a lag.

    Someone suggested this may deal with spring. I would like to hear more on this, since it can possibly help many others in this situation too.