我已经在我的app文件夹中直接在文件中定义了一个模块,但是我无法在ActiveRecord类中使用它的方法(方法无法识别)。据我了解,应用程序文件夹中的文件应该由rails自动生成。
我也试图手动包含它:
class Picture < ActiveRecord::Base
include Curation
...
end
但我得到
NameError: uninitialized constant Picture::Curation
我是否对此有误,实际上是否需要手动要求所有新文件?
答案 0 :(得分:4)
Rails不需要开发模式下app的所有文件。相反,当您引用未定义的常量时,它会根据需要加载文件。然后它从类或模块的名称猜测文件名。在您的情况下,您在Curation
文件中定义了gallery_curation
模块。当Rails注意到未定义的Curation
模块时,它正在curation.rb
的所有子目录中查找app
文件。显然无法找到该文件,因此例外。
您有3个选择:
curation
或将模块重命名为GalleryCuration
Curation
设置自动加载路径。为了您的理智,建议遵循惯例。
有关Rails自动加载的更多信息:http://guides.rubyonrails.org/autoloading_and_reloading_constants.html
答案 1 :(得分:3)
Rails不会从app
目录自动加载。如果它只是模型中使用的模块,那么您可以将它放在app/models
目录中(它实际上不是模型并不重要)。或者,如果它在不同类别的类中使用,您可能最好将其放在lib
。
此外,只有当rails可以正确猜出常量(本例中为模块)所包含的文件名时,rails自动加载才有效。
这意味着您需要调用文件curation.rb
以获取rails来自动加载Curation
模块。