Rails 3自动加载

15

我有一个名为ConstData的类:

class ConstData

  US_CITIES = ['miami', 'new york']

  EUROPERN_CITIES = ['madrid', 'london']

end

它存储在/lib/const_data.rb下面。

这个想法是,在模型、控制器或视图中,我可以这样做:

ConstData::US_CITIES 来获取US_CITIES等内容。

Rails应该自动加载这个类,我从这里得到了信息: http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/662abfd1df9b2612?hl=en

然而,这不起作用。有人能解释一下如何实现吗?

4个回答

48
@daniel提到的帖子是从2008年的。自那以后,Rails已经发生了变化。
事实上,最近非常明显。Rails3不会自动加载lib/目录。
但你可以很容易地重新激活它。打开config/application.rb并在配置(在类中)中添加以下内容:
config.autoload_paths += %W(#{config.root}/lib)

然后你的 lib/ 目录将被自动加载。


谢谢您,先生。我会在6分钟内接受它。不过,您能告诉我如何检查您的自动加载路径中有什么吗? - daniel
2
<<YourApplication>>::Application.config.autoload_paths - Morgan Christiansson
6
警告!你可能在 /lib 目录下有各种类型的模块,这些模块的配置信息被设置在初始化程序中。当重新加载模块时,这些配置信息将会丢失,在开发过程中会导致那些在测试和生产环境中正常工作的事物出现莫名其妙的故障。解决方法是将 /lib 路径添加到 config.autoload_once_paths 而不是 config.autoload_paths。 - Steve Jorgensen
4
值得注意的是,文件名很重要。虽然这个例子不适用,但它与之相关并且我花了很长时间才意识到我的错误。参见:https://dev59.com/RW855IYBdhLWcg3w7o-g - Jon Smock

13

autoload_paths没有起作用,所以你被迫执行了以下操作:

Dir["lib/**/*.rb"].each do |path|
  require_dependency path
end

这是因为您忘记了对类进行命名空间

lib/awesome/stuffs.rb应该包含一个如下的类/模块:

class/module Awesome::Stuffs
....

但是你有:

class/module Stuffs
....

Rails 只能自动加载与文件路径和文件名匹配的类和模块。

:)


不错。这个之前没有提到,给我带来了很多问题。如果我使用复合名词作为模块名称,如何使加载路径匹配?(例如 lib/monkey_man/engine.rb --> 模块 MonkeyMan::Engine?)它会自动转换为驼峰式吗? - Vivek

2

config.autoload_paths 对我没有起作用。我通过在 ApplicationController 中添加以下内容来解决它:

Dir["lib/**/*.rb"].each do |path|
  require_dependency path
end

1

按照以下步骤使lib目录自动加载:

development.rbproduction.rb中删除config.threadsafe!;

config/application.rb中添加:

config.autoload_paths += %W(#{config.root}/lib)
config.threadsafe!
config.dependency_loading = true

谢谢。我在一系列的更改中添加了 confing.threadsafe!,试图让 wicked_pdf 正常工作,这就是我的自动加载停止工作的原因。 - TheRightChoyce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接