首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启用zeitwerk后重新加载时未初始化的常数

启用zeitwerk后重新加载时未初始化的常数
EN

Stack Overflow用户
提问于 2022-03-04 05:29:06
回答 1查看 877关注 0票数 1

在完成从经典到Zeitwerk的迁移时遇到了一些困难。

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

有些东西配置错了,但是我正在抓我的头,想弄清楚细节。我当时的印象是,拥有一个顶级的/lib文件夹很好,并且使用require在该目录中加载文件与Zeitwerk兼容,但现在我不太确定.关于我做错了什么的想法?

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

编辑:按照@Xavier的建议用日志输出更新

代码语言:javascript
复制
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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-04 20:27:37

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

这很好,它是支持的。您只需要考虑加载优先级,因为如果lib定义了CustomModule::Foo,Rails认为CustomModule是可重加载的,那么在重新加载时没有人再次加载CustomModule::Foo,而require是幂等的,因此不会再找到CustomModule::Foo

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

这样,当自动加载程序扫描文件系统时,它知道它不负责管理CustomModule。它会下降的。如果有子常量,那么一切都将像往常一样工作,这些常量将被重新加载,但是名称空间本身不会。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71346980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档