ActiveSupport自动加载不在Rails之外工作

时间:2017-03-05 23:24:31

标签: ruby-on-rails ruby

给定文件结构

lib
  app/
    feature.rb
  app.rb

并且文件app.rb包含:

require 'active_support'
require 'active_support/dependencies'

module App
  extend ActiveSupport::Autoload

  autoload :Feature, 'app/feature.rb'

  def self.start
    p Feature.new
  end
end

它抱怨LoadError: cannot load such file -- app/feature.rb

我尝试传递绝对系统路径,没有路径,来自模块的feature.rb的相对路径以及来自执行点的相对路径(lib上方的一个目录)。

这似乎与Rails在source中所做的完全相同。

这样看起来应该很直观,不是吗?

2 个答案:

答案 0 :(得分:2)

解决方案是将文件添加到Ruby解释器加载路径,如下所示:$LOAD_PATH.unshift(File.dirname(__FILE__))

基本上,它允许Ruby查找这些文件。在已生成新应用程序时已配置的Rails中。在构建gem时,您可以在规范中将文件或dirs添加到加载路径。除此之外,比如说这个例子中的脚本,您必须手动执行此操作。默认情况下autoload 执行此操作,因此您必须指定(对我来说有点令人困惑)Ruby可以访问的路径。

我确信有人可以清理这个解释,但这就是我理解它的方式。

答案 1 :(得分:0)

默认情况下,我不相信Rails的自动加载路径上有lib。我们在config/application.rb

中获得了以下内容
config.eager_load_paths << Rails.root.join('lib')