gpt4 book ai didi

ruby-on-rails - 启用 zeitwerk 后重新加载时未初始化的常量

转载 作者:行者123 更新时间:2023-12-05 09:28:24 24 4
gpt4 key购买 nike

在解决从 Classic 到 Zeitwerk 的迁移时遇到了一些问题。

启用 zeitwerk 并运行 rails s 后,一切似乎都正常。然后在保存 .rb 文件并刷新后,我在尝试从顶级 /lib 获取文件时看到“未初始化常量”错误。

重新加载时配置错误,但我正在绞尽脑汁想弄清楚细节。我的印象是拥有顶级 /lib 文件夹很好并且使用 require 加载该目录中的文件与 Zeitwerk 兼容,但现在我不是这样了当然...关于我出错的想法?​​

注意:我目前没有设置任何特定的 eager_load_pathsautoload_paths

编辑:根据 @Xavier 的建议更新了日志输出

Zeitwerk@rails.main: module CustomModule autovivified from directory *********/app/workers/custom_module
Zeitwerk@rails.main: autoload set for CustomModule::Profiler, to be loaded from *********/app/workers/custom_module/profiler.rb
Zeitwerk@rails.main: autoload set for CustomModule::AnotherProfiler, to be loaded from *********/app/workers/custom_module/another_profiler.rb

NameError - uninitialized constant CustomModule::AttributeParser
Did you mean? NameParserConstants:
app/models/user.rb:180:in `first_name'
app/middleware/catch_json_parse_errors.rb:8:in `call'
app/middleware/decompress_requests.rb:22:in `call'

最佳答案

命名空间 CustomModule在项目中可重新加载的部分(在 app 下)和不可重新加载的部分(在 lib 下)共享。

这个很好,支持。你只需要刻意考虑负载优先级,因为如果 lib定义 CustomModule::Foo和 Rails 认为 CustomModule是可重新加载的,重新加载时没有人正在加载 CustomModule::Foo再次,require是幂等的,所以 CustomModule::Foo不会再被发现了。

解决方案是确保lib 定义命名空间,Rails 自动加载器重新打开它。与记录的基本相同here .这可以通过发出 require 来完成。在从 lib 加载命名空间的初始化程序中,例如。

这样,当自动加载器扫描文件系统时,它知道它不负责管理 CustomModule .它会下降。如果有子常量,一切都会照常工作,并且会重新加载这些常量,但命名空间本身不会。

关于ruby-on-rails - 启用 zeitwerk 后重新加载时未初始化的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71346980/

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