问题标签 [zeitwerk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
23 浏览

ruby-on-rails - Zeitwerk 在生产加载自定义 SimpleNavigation 渲染器时失败

通过切换到 Zeitwerk 自动加载器(Ruby 2.7.5 上的 Rails 6.1.4.4)为 Rails 7 做好准备。关闭了config.autoloader = :classicapplication.rb中的线路。应用程序正在加载 6.1 默认值。

开发模式运行良好,但启动时生产失败(在生产模式下本地也失败):

(这是在暂存环境中的 Heroku-20 上)。

但是,该文件确实将其定义为一个类:

我不确定为什么双重/app/app存在,因为该目录只是在应用程序中以及其他所有内容:

来自相关 Rails 应用程序的文件目录的屏幕截图

0 投票
0 回答
13 浏览

ruby-on-rails - 定义引擎模型与其父应用的关系的最佳实践是什么?

在 Rails 6.1 中使用 Zeitwerk,我有一个可以调用的引擎Users

一个用户有很多:blog_posts,但模型BlogPost是在主应用程序中定义的。

既然如此,最好的做法是:

A.定义模型内的关系

或者B.将这种关系定义为主应用程序中的装饰器?

我的部分理解是,由于 Zeitwerk,选项 A 会很好,因为自动加载器会将所有内容移动到主应用程序的根目录。但是,我听说选项 B 可以说更好地防止依赖循环。

0 投票
0 回答
17 浏览

ruby-on-rails - 运行 zeitwerk 测试时未初始化的常量 WebHook::Endpoint

我最近开始升级我的应用程序以使用 Rails 6。有些非常顺利,有些则不是。

我现在面临的问题是在工厂机器人中我们定义:

运行 rails zeitwerk:check 时,它只会抛出未初始化的常量 WebHookEndpoint。

模块和类在模型文件夹中定义。

我想知道我需要或包含它才能实现它的存在。

0 投票
1 回答
32 浏览

ruby-on-rails - Rails:自动重新加载虚拟应用程序中使用的 gem 文件

在开发 gem 时,我经常使用一个需要 gem 的虚拟 rails 应用程序,以便在我进行时尝试 gem 更改。此外,我使用相同的虚拟应用程序进行集成测试。

通常,我有宝石

以及相关的虚拟应用程序:

使用zeitwerk代码加载器,我如何配置虚拟应用程序不仅可以在更改时重新加载虚拟应用程序 ruby​​ 文件,还可以获取对 gem 文件的更改?否则,在开发 gem 时,我必须为 gem 文件的每次更改重新加载 dummy-app rails 服务器。

不工作:config.autoload_paths

我尝试将 gem 添加到自动加载路径,但代码不会在文件系统更改时重新加载。

没用:Zeitwerk::Loaderenable_reloading

添加单独的 zeitwerk 加载程序没有帮助;据我所知,加载程序没有文件系统观察程序;所以需要调用gem_loader.reload才能重新加载 gem 类。

没用:Zeitwerk::Loader#reloadrequire

如果 gem 中需要 gem 的文件,例如

然后该文件~/rails/foo_gem/lib/foo_gem/bar.rbZeitwerk::Loader. 调用gem_loader.reload不会重新加载此文件。

没有用:Zeitwerk::Loader#reload使用 zeitwerk 加载器来加载 gem 文件

如果 gem 的文件不是手动需要的,而是使用不同的 zeitwerk 加载器,例如

然后目录~/rails/foo_gem/lib由两个独立的 zeitwerk 加载器管理:loaderinfoo_gem.rbgem_loaderin development.rb。这显然是 zeitwerk 不允许的,它抱怨Zeitwerk::Error

loader ...想要管理目录~/rails/foo_gem/lib,该目录已经由...管理

不工作:ActiveSupport::FileUpdateChecker

我尝试使用ActiveSupport::FileUpdateChecker来监视更改,但是,至少在我的 dockerized 设置中,重新加载代码的块永远不会执行。

0 投票
1 回答
32 浏览

ruby-on-rails - Zeitwerk 和嵌套在类中的模块

我在使用 Rails 应用程序从经典的自动加载器切换到 Zeitwerk 时遇到了一些麻烦,该应用程序在 Rails 3 天里就已经出现了——所以那里有一些硬壳。

一些模型代码已被提取到模块中,这些模块嵌套在模型类(充当命名空间)中:

然后在需要时动态使用这些模块:

由于默认情况下不添加子目录app/models,因此它在 中明确完成application.rb

Zeitwerkeager_load_paths需要这些(根据 Rails 指南),但是,Zeitwerk 似乎不喜欢这个星座:

奇怪,因为Download是在那里定义的。知道这里发生了什么以及如何最好地重构事物以与 Zeitwerk 一起工作吗?

感谢您的提示!

0 投票
1 回答
21 浏览

ruby-on-rails - Rails 7活动作业的自动加载问题

我的 Rails 7 应用程序中有一个应用程序目录 app/beer,在该文件夹中有一个名为 cool.rb 的文件,其中定义了执行方法。

因此,在 ActiveJob DrinkSudsJob执行方法中,我从cool.rb 调用方法执行为:

但是我的应用程序爆炸了。告诉我统一常量 DrinkSudsJob::Beer

Zeitwerk:check 告诉我一切都很好。我在这里做错了什么?

0 投票
1 回答
55 浏览

ruby - 未找到 rails 7 zietwerk 常量

我正在将我们的应用程序从 rails 6 升级到 7,我使用的是 zeitwerk 而不是带有 rails 6 的经典自动加载器,没有任何问题,现在没有对文件夹/文件命名约定或结构进行任何更改,它无法在里面找到任何类/模块lib 文件夹。我一直在调试 zeitwerk gem,并且 autoloads 哈希将文件路径作为键和[Namespace, Constant Name]值,使用 rails 6 它具有正确的名称空间,例如,对于其中的文件,\user\project\rails6_test\lib\folder\config.rb它将具有Folder作为命名空间并Config在内部定义的config.rb正确找到在Folder命名空间中,但在使用 rails 7 迁移后,它始终具有Object命名空间,不仅适用于顶级文件夹,而且适用于所有嵌套文件,显然它无法在Object.

我没有看到升级指南中遗漏的任何内容,这里可能遗漏了什么?

更新

我尝试运行bin/rails r 'pp ActiveSupport::Dependencies.autoload_paths',但出现以下错误,

config.autoload_paths << "#{config.root}/lib"在我的 application.rb 中有我添加的 zeitwerk 测试预加载config.eager_load_paths += Dir["#{config.root}/lib/**/"],如果您需要更多信息,请告诉我。

0 投票
1 回答
113 浏览

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

从 Classic 迁移到 Zeitwerk 时遇到了一些麻烦。

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

重新加载时配置错误,但我正在挠头试图找出细节。我的印象是拥有一个顶级/lib文件夹很好,并且require用于在该目录中加载文件与 Zeitwerk 兼容,但现在我不太确定......关于我出错的想法?

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

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