Rails 无法仅在第一次尝试时自动加载常量

Rails unable to autoload constant only on first attempt

在我的 Rails 4 应用程序中,我有一个基础模型,我们称它为 Badge,它位于 /app/models/badge.rb.

然后,我有大量继承自 Badge 的特定徽章,比方说 GoldBadgeSilverBadge(实际上还有更多)。所有这些文件都位于 /app/model/badge/<name>_badge.rb 中。例如,/app/model/badge/gold_badge.rb.

GoldBadge 的 class 声明如下所示

class GoldBadge < Badge
  ...

但是,Rails(或 Ruby,我真的不知道)自动加载器在第一次尝试时无法找到这些文件.我的意思是当我第一次访问需要使用GoldBadge的页面时,我得到以下错误:

Unable to autoload constant Badge::GoldBadge, expected /path_to_my_rails_app/app/models/badge/gold_badge.rb to define it

这很奇怪,因为 class 是在该文件中定义的。然而,更奇怪的是,如果我随后刷新页面,一切正常 - class 被发现了!

在我引用多种不同类型徽章的页面上,我必须为每种不同类型刷新页面一次,然后才能正常工作。例如,如果我有一个使用 GoldBadgeSilverBadgeBronzeBadge 的页面,我会刷新页面 3 次,并在它之前为每种徽章类型显示一次该错误终于可以用了。

这发生在开发模式中。据我所知,这可能会在生产中消失,但在开发模式下仍然很烦人。有什么方法可以修复它(最好不要缓存 classes)?

如果你把它放在命名空间下,比如 app/models/badge 文件夹,你必须像这样定义你的 class:

class Badge::GoldBadge < Badge
  #...
end

自动加载它并能够像Badge::GoldBadge一样访问它。 如果你想通过调用 GoldBadge 来访问它,那么将它移动到 app/models 目录。