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.
| 归档时间: |
|
| 查看次数: |
9417 次 |
| 最近记录: |