使用Rails中的命名空间类防止"警告:用A :: B引用的常量B"

nic*_*ckh 15 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

将文件存储在自定义目录(例如:)时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>
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个示例Rails 3.2应用程序来重现这个问题.

config/application.rb,应用程序配置为加载文件app/presenters/.

Dav*_*gle 17

我在初始化程序中使用require语句解决了这个问题.我不喜欢它,但我喜欢我的应用程序的结构和类名,它们是有道理的,所以初始化程序是我最好的解决方案.在初始化程序中尝试:

require File.join(Rails.root, "app", "presenters", "mega_menu", "catalog_presenter")
require File.join(Rails.root, "app", "presenters", "catalog_presenter")
Run Code Online (Sandbox Code Playgroud)

出现此问题的原因是autoload依赖于const_missing被调用,这在您的情况下不会发生.

当ruby第一次遇到对MegaMenu :: CatalogPresenter的引用时,mega_menu/catalog_presenter.rb文件尚未包含在内.标准的ruby行为导致它在命名空间树(语言图)中向上移动,而是找到顶级引用CatalogPresenter,因为此时已包含此HAS.

  • 这适用于任何地方.这只是一个如何解决缺失常数的问题.如果确保明确要求同时使用这两个模型,则不应遇到此问题. (2认同)