为什么 Rails 不从 app/services 自动加载类?

我正在开发一个 Rails 4.2应用程序,刚刚在结构中添加了 app/services/fetch_artists.rb。在这个文件中,我定义了一个 class FetchArtists; end

当尝试运行 rails r 'FetchArtists'时,它给我一个 NameError: uninitialized constant FetchArtists

我试着看了看 ActiveSupport::Dependencies.autoload_paths,的确,app/services不在那里:

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

我的问题是,为什么这个文件夹没有自动加载,我应该怎么做呢?

剪辑

非常奇怪,在用 rails runner重复运行上述命令之后,新的文件夹出现在自动加载路径上。我不知道为什么事情发生得这么慢。

有人认为这可能与 spring有关。我希望听到更多关于这方面的信息,因为它可能也能帮助很多处于这种情况的人。

31012 次浏览

你应该把它写进 autoload_paths:

config.autoload_paths += %W(#{Rails.root}/app/services)

我遇到了类似的问题,快速浏览了一下 Spring 文档,发现了关于 守望者的这一点。

我在 application.rb 中添加了以下内容,一切都就绪了-

Spring.watch "app/services/**"

我不是这方面的专家。

我也遇到了同样的问题,却找不到解决办法。我没有足够的耐心等待自动加载最终完成,所以我的快速解决方案是打开 ear _ load,并启动我的服务器。终于可以装载了。后来我把它关掉了,我的课还没上完。

使用: config.eager_load = true

在你的 config/environments/development.rb

我遇到了同样的问题,这似乎是一个缓存问题与 Spring,一个处理预加载您的应用程序的过程。它用于 Web 服务器以及控制台和 Rake 任务。

使用 bin/spring stop停止 Spring 将强制 Spring 全新加载应用程序。现在运行 rails console和检查 ActiveSupport::Dependencies.autoload_paths将成功地显示 app/services

在我的例子中,Spring 没有监视 app/services目录的更改——重新启动 Spring 将加载该类,但是对现有类或新类的更改将需要重新启动 Spring 才能应用。

为了解决这个问题,我将它添加到了 Spring 在 config/spring.rb中观察的目录列表中:

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

又一次重启了春天。