为什么不从应用程序/服务Rails自动加载类?

lin*_*ndy 51 ruby-on-rails autoload ruby-on-rails-4.2

我正在研究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
Run Code Online (Sandbox Code Playgroud)

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

编辑

很奇怪,在反复运行上面的命令后rails runner,新文件夹出现在自动加载路径上.我不知道为什么会发生这样的延迟.

有人建议这可以处理spring.我想更多地了解这一点,因为它也可能在这种情况下帮助许多其他人.

mak*_*knz 88

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

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

  • 另外,命名很重要,请参阅>> /sf/ask/2628320901/ (4认同)

小智 17

在我的情况下,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) }
Run Code Online (Sandbox Code Playgroud)

并重新启动Spring一次.


sba*_*uch 12

我遇到了类似的问题,并快速浏览了一下Spring文档并发现了一些关于观察者的问题.

我在应用程序中添加了以下内容.rb并且事情已经到位 -

Spring.watch "app/services/**"
Run Code Online (Sandbox Code Playgroud)

我不是这里的专家,ymmv.


Dan*_*tti 7

我遇到了同样的问题,但没有找到解决办法.我没耐心等待自动加载最终加载它,所以我的快速解决方案是打开eager_load,然后启动我的服务器.它最终会加载它.之后我把它关掉了,我的班级仍然装满了.

只需使用: config.eager_load = true

在你的 config/environments/development.rb


dim*_*ura -4

您应该将其包含到autoload_paths

config.autoload_paths += %W(#{Rails.root}/app/services)
Run Code Online (Sandbox Code Playgroud)

  • 据我了解,直接在“app”下的所有内容都会自动加载:http://edgeguides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths (11认同)
  • @JoelL 实际上他从命令行尝试过。所以这可能与春天有关。 (4认同)
  • 使用“bin/spring stop”停止 Spring 对我有用,并允许在下次应用程序启动时自动选取“app/services”目录。您可以通过检查“ActiveSupport::Dependency.autoload_paths”从 Rails 控制台确认自动加载路径。 (3认同)