Rails只能在第一次尝试时无法自动加载

时间:2015-01-16 21:07:05

标签: ruby-on-rails ruby ruby-on-rails-4 autoload

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

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

GoldBadge的类声明如下所示

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

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

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

这在开发模式中发生。从我所读过的内容来看,这可能会在制作中消失,但在开发模式下它仍然非常烦人。有没有办法解决它(最好没有缓存类)?

1 个答案:

答案 0 :(得分:2)

如果你把它放在命名空间下,比如app/models/badge文件夹,你就可以定义你的类:

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

自动加载它并能够以Badge::GoldBadge的方式访问它。 如果您只想调用GoldBadge来访问它,请将其移至app/models目录。