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

前端之家收集整理的这篇文章主要介绍了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.

原文链接:https://www.f2er.com/ruby/273410.html

猜你在找的Ruby相关文章