ruby-on-rails – 防止在Rails中使用命名空间类的“warning:toplevel constant B引用的A :: B”

文件存储在自定义目录(例如:app / presenters /)中时,如何确保加载命名空间的类?

例如,如果你有:

> app/models/mega_menu.rb
> app/presenters/catalog_presenter.rb
> app/presenters/mega_menu/catalog_presenter.rb

Rails无法加载MegaMenu :: CatalogPresenter:

CatalogPresenter.new
=> #<CatalogPresenter:0x85bca68 @_routes=nil>

MegaMenu::CatalogPresenter.new
(irb):3: warning: toplevel constant CatalogPresenter referenced by MegaMenu::CatalogPresenter
=> #<CatalogPresenter:0x85750a0 @_routes=nil>

我创建了一个sample Rails 3.2 app that reproduces this problem.

在config / application.rb中,app’s configured to load files in app/presenters/.

解决方法

我在初始化程序中使用了一个require语句来解决这个问题.我不喜欢它,但我喜欢我的应用程序的结构和类名称,它们是有意义的,所以初始化器是我最好的解决方案.在初始化程序中尝试:
require File.join(Rails.root,"app","presenters","mega_menu","catalog_presenter")
require File.join(Rails.root,"catalog_presenter")

发生这个问题是因为autoload依赖于调用const_missing而不会在您的情况下发生.

当ruby首次遇到对MegaMenu :: CatalogPresenter的引用时,未包含mega_menu / catalog_presenter.rb文件.标准的红宝石行为导致它向上移动命名空间树(说明字体),而是在此处查找顶级参考CatalogPresenter.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...