将文件存储在自定义目录(例如: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.