Rails 无法仅在第一次尝试时自动加载常量
Rails unable to autoload constant only on first attempt
在我的 Rails 4 应用程序中,我有一个基础模型,我们称它为 Badge,它位于 /app/models/badge.rb
.
然后,我有大量继承自 Badge 的特定徽章,比方说 GoldBadge
和 SilverBadge
(实际上还有更多)。所有这些文件都位于 /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 被发现了!
在我引用多种不同类型徽章的页面上,我必须为每种不同类型刷新页面一次,然后才能正常工作。例如,如果我有一个使用 GoldBadge
、SilverBadge
和 BronzeBadge
的页面,我会刷新页面 3 次,并在它之前为每种徽章类型显示一次该错误终于可以用了。
这发生在开发模式中。据我所知,这可能会在生产中消失,但在开发模式下仍然很烦人。有什么方法可以修复它(最好不要缓存 classes)?
如果你把它放在命名空间下,比如 app/models/badge
文件夹,你必须像这样定义你的 class:
class Badge::GoldBadge < Badge
#...
end
自动加载它并能够像Badge::GoldBadge
一样访问它。
如果你想通过调用 GoldBadge
来访问它,那么将它移动到 app/models
目录。
在我的 Rails 4 应用程序中,我有一个基础模型,我们称它为 Badge,它位于 /app/models/badge.rb
.
然后,我有大量继承自 Badge 的特定徽章,比方说 GoldBadge
和 SilverBadge
(实际上还有更多)。所有这些文件都位于 /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 被发现了!
在我引用多种不同类型徽章的页面上,我必须为每种不同类型刷新页面一次,然后才能正常工作。例如,如果我有一个使用 GoldBadge
、SilverBadge
和 BronzeBadge
的页面,我会刷新页面 3 次,并在它之前为每种徽章类型显示一次该错误终于可以用了。
这发生在开发模式中。据我所知,这可能会在生产中消失,但在开发模式下仍然很烦人。有什么方法可以修复它(最好不要缓存 classes)?
如果你把它放在命名空间下,比如 app/models/badge
文件夹,你必须像这样定义你的 class:
class Badge::GoldBadge < Badge
#...
end
自动加载它并能够像Badge::GoldBadge
一样访问它。
如果你想通过调用 GoldBadge
来访问它,那么将它移动到 app/models
目录。