【问题标题】:Rails: Unable to include module in ClassRails:无法在类中包含模块
【发布时间】:2015-04-24 12:26:51
【问题描述】:

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

我也尝试过手动包含它:

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

但我明白了

NameError: uninitialized constant Picture::Curation 

我是不是弄错了,实际上确实需要手动要求所有新文件?

【问题讨论】:

  • 查看这篇文章,对你有帮助:stackoverflow.com/questions/9011624/…
  • 如果您显示 Curation 模块的代码以及您放置的文件的路径/文件名是什么,将会很有帮助。
  • @TanguyS 在那个问题中,开发人员正试图将其包含在一个模块中
  • @PiotrJakubowski Curation 模块的文件路径是 app/gallery_curation.rb。策展代码的形式为:module Curation def method1 .... end .... end

标签: ruby-on-rails ruby


【解决方案1】:

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

您有 3 个选择:

  1. 遵循 Rails 的约定,将文件重命名为 curation 或将模块重命名为 GalleryCuration
  2. 使用自定义 require_dependency
  3. 在初始化程序的某处为Curation 设置自动加载路径。

为了您的理智,建议遵循惯例。

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

【讨论】:

  • 谢谢,我确实选择了第一个。不幸的是,我仍然无法调用模块的方法
  • @user1618840 你是什么意思你不能调用模块的方法?我想我需要具体的例子。
  • 在控制台中:Curation.method_defined?(:curate_gallery) => true
  • Curation.curate_gallery => NoMethodError: Curate:Module 的未定义方法 `curate_gallery'
  • 当你在类中包含一个模块时,模块的方法就是类的instance_methods。这意味着您可以使用Picture.new.curate_gallery 而不是Curation.curate_galleryPicture.curate_gallery
【解决方案2】:

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

此外,rails 自动加载仅在 rails 能够正确猜测常量(在本例中为模块)将包含在其中的文件的名称时才有效。

这意味着你需要调用你的文件curation.rb,让rails自动加载Curation模块。

【讨论】:

  • 我试着把它放在app/models中,结果一样
  • 您需要提供更多关于您的 app/models/curation.rb 文件内容的详细信息。
  • 我已更新我的答案以反映有关文件名称的新信息。
  • 谢谢,这有助于它现在似乎包含该模块。不幸的是我仍然不能调用它的任何方法
猜你喜欢
  • 2018-07-05
  • 2012-02-19
  • 2012-08-14
  • 2021-12-25
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多