Rails:无法在类

时间:2015-04-24 12:26:51

标签: ruby-on-rails ruby

我已经在我的app文件夹中直接在文件中定义了一个模块,但是我无法在ActiveRecord类中使用它的方法(方法无法识别)。据我了解,应用程序文件夹中的文件应该由rails自动生成。

我也试图手动包含它:

class Picture < ActiveRecord::Base
    include Curation
    ...
end

但我得到

NameError: uninitialized constant Picture::Curation 

我是否对此有误,实际上是否需要手动要求所有新文件?

2 个答案:

答案 0 :(得分:4)

Rails不需要开发模式下app的所有文件。相反,当您引用未定义的常量时,它会根据需要加载文件。然后它从类或模块的名称猜测文件名。在您的情况下,您在Curation文件中定义了gallery_curation模块。当Rails注意到未定义的Curation模块时,它正在curation.rb的所有子目录中查找app文件。显然无法找到该文件,因此例外。

您有3个选择:

  1. 使用Rails的约定,将文件重命名为curation或将模块重命名为GalleryCuration
  2. 使用自定义require_dependency
  3. 在初始值设定项的某处为Curation设置自动加载路径。
  4. 为了您的理智,建议遵循惯例。

    有关Rails自动加载的更多信息:http://guides.rubyonrails.org/autoloading_and_reloading_constants.html

答案 1 :(得分:3)

Rails不会从app目录自动加载。如果它只是模型中使用的模块,那么您可以将它放在app/models目录中(它实际上不是模型并不重要)。或者,如果它在不同类别的类中使用,您可能最好将其放在lib

此外,只有当rails可以正确猜出常量(本例中为模块)所包含的文件名时,rails自动加载才有效。

这意味着您需要调用文件curation.rb以获取rails来自动加载Curation模块。