ruby-on-rails - 使用 Rails 中的命名空间类防止 "warning: toplevel constant B referenced by A::B"

标签 ruby-on-rails ruby 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>

我创建了一个 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, "app", "presenters", "catalog_presenter")

出现此问题是因为自动加载依赖于调用 const_missing,而这在您的情况下不会发生。

当 ruby​​ 第一次遇到对 MegaMenu::CatalogPresenter 的引用时,mega_menu/catalog_presenter.rb 文件还没有被包含进来。标准的 ruby​​ 行为导致它沿着命名空间树(修辞格)向上走,而是找到顶级引用 CatalogPresenter,因为此时已将其包含在内。

关于ruby-on-rails - 使用 Rails 中的命名空间类防止 "warning: toplevel constant B referenced by A::B",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807827/

相关文章:

ruby-on-rails - 同一个应用程序中的 Heroku Delayed Job 和 Sidekiq

ruby-on-rails - Rails 生成错误 : No such file or directory - getcwd

ruby-on-rails - oink 日志命令不适用于 heroku

ruby - 在 Postgresql 中创建数据库/用户的示例 Ruby 代码

ruby-on-rails - Ruby on Rails 的 OAuth 和 500px API 问题

ruby-on-rails - 将 Excel 电子表格中的数据提取到 Ruby 中的数据库中

ruby-on-rails - 我应该采取什么步骤来添加我新创建的 Gem?我怎样才能访问它?

ruby-on-rails - 如何为 Rails 应用程序创建应用程序范围的 slug 路由?

ruby-on-rails-3 - 将 webmock 与 cucumber 一起使用

jquery - Rails 3,如何构建 link_to :remote => true that highlights and fades out a deleted item