Why doesn't Rails autoload classes from app/services?
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
linkyndy
Passionate about everything web-related. Love cycling, snooker, swimming and traveling.
Updated on July 27, 2022Comments
-
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 aclass FetchArtists; end
.When trying to run
rails r 'FetchArtists'
it gives me aNameError: 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.