gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:36:51 26 4
gpt4 key购买 nike

在自定义目录(例如: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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com