将文件存储在自定义目录中时(例如:app/presenters/
),如何确保加载命名空间类?
例如,如果你有:
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/
。
答案 0 :(得分:17)
我在初始化程序中使用require语句解决了这个问题。我不喜欢它,但我喜欢我的应用程序的结构和类名,它们是有道理的,所以初始化程序是我最好的解决方案。在初始化程序中尝试:
require File.join(Rails.root, "app", "presenters", "mega_menu", "catalog_presenter")
require File.join(Rails.root, "app", "presenters", "catalog_presenter")
出现此问题的原因是autoload依赖于const_missing被调用,这在您的情况下不会发生。
当ruby第一次遇到对MegaMenu :: CatalogPresenter的引用时, mega_menu / catalog_presenter.rb 文件尚未包含在内。标准的ruby行为导致它在命名空间树(语言图)中向上移动,而是找到顶级引用CatalogPresenter,因为此时已包含此HAS。
答案 1 :(得分:0)
在类中创建新的顶级常量会引发此错误。你想在catalog_presenter.rb中找到更像这样的东西:
class MegaMenu
class MegaMenu::CatalogPresenter
end
end