autoload_paths

假设 Rails 项目根目录下有如下目录以及 .rb 文件,

(root/)extras/foo.rb

如果啥也不干, 直接打开 rails console:

1
2
3
4
5
6
7
[1] pry(main)> defined?(Foo)
=> nil

[2] pry(main)> Foo
NameError: uninitialized constant Foo
from (pry):2:in `<main>'

在 application.rb 中加入一行:

config.autoload_paths += %W(#{config.root}/extras)

再重启 rails console:

1
2
3
4
5
6
7
8
[1] pry(main)> defined?(Foo)
=> nil

[2] pry(main)> Foo
=> Foo

[3] pry(main)> defined?(Foo)
=> "constant"

这是 autoload_paths 延迟加载的作用, 只有当用到的时候再去查找这个常量. 而开发环境 app 目录下的所有文件都是这样延迟加载的.

但是, 在生产环境中:

1
2
3
4
5
6
7
8
# app/models/segment.rb  已经预加载
[1] pry(main)> defined?(Segment)
=> "constant"

# foo.rb 还是延迟加载
[2] pry(main)> defined?(Foo)
=> nil

eager_load_paths

这个时候需要的是 eager_load_paths

在 application.rb 中加上

config.eager_load_paths += %W( #{config.root}/extras )

1
2
3
# extras/foo.rb 已经预加载
[1] pry(main)> defined?(Foo)
=> "constant"