问题标签 [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.
ruby-on-rails - 定义引擎模型与其父应用的关系的最佳实践是什么?
在 Rails 6.1 中使用 Zeitwerk,我有一个可以调用的引擎Users
一个用户有很多:blog_posts
,但模型BlogPost
是在主应用程序中定义的。
既然如此,最好的做法是:
A.定义模型内的关系
或者B.将这种关系定义为主应用程序中的装饰器?
我的部分理解是,由于 Zeitwerk,选项 A 会很好,因为自动加载器会将所有内容移动到主应用程序的根目录。但是,我听说选项 B 可以说更好地防止依赖循环。
ruby-on-rails - 运行 zeitwerk 测试时未初始化的常量 WebHook::Endpoint
我最近开始升级我的应用程序以使用 Rails 6。有些非常顺利,有些则不是。
我现在面临的问题是在工厂机器人中我们定义:
运行 rails zeitwerk:check 时,它只会抛出未初始化的常量 WebHookEndpoint。
模块和类在模型文件夹中定义。
我想知道我需要或包含它才能实现它的存在。
ruby-on-rails - Rails:自动重新加载虚拟应用程序中使用的 gem 文件
在开发 gem 时,我经常使用一个需要 gem 的虚拟 rails 应用程序,以便在我进行时尝试 gem 更改。此外,我使用相同的虚拟应用程序进行集成测试。
通常,我有宝石
以及相关的虚拟应用程序:
使用zeitwerk代码加载器,我如何配置虚拟应用程序不仅可以在更改时重新加载虚拟应用程序 ruby 文件,还可以获取对 gem 文件的更改?否则,在开发 gem 时,我必须为 gem 文件的每次更改重新加载 dummy-app rails 服务器。
不工作:config.autoload_paths
我尝试将 gem 添加到自动加载路径,但代码不会在文件系统更改时重新加载。
没用:Zeitwerk::Loader
有enable_reloading
添加单独的 zeitwerk 加载程序没有帮助;据我所知,加载程序没有文件系统观察程序;所以需要调用gem_loader.reload
才能重新加载 gem 类。
没用:Zeitwerk::Loader#reload
有require
如果 gem 中需要 gem 的文件,例如
然后该文件~/rails/foo_gem/lib/foo_gem/bar.rb
被Zeitwerk::Loader
. 调用gem_loader.reload
不会重新加载此文件。
没有用:Zeitwerk::Loader#reload
使用 zeitwerk 加载器来加载 gem 文件
如果 gem 的文件不是手动需要的,而是使用不同的 zeitwerk 加载器,例如
然后目录~/rails/foo_gem/lib
由两个独立的 zeitwerk 加载器管理:loader
infoo_gem.rb
和gem_loader
in development.rb
。这显然是 zeitwerk 不允许的,它抱怨Zeitwerk::Error
:
loader ...想要管理目录~/rails/foo_gem/lib,该目录已经由...管理
不工作:ActiveSupport::FileUpdateChecker
我尝试使用ActiveSupport::FileUpdateChecker
来监视更改,但是,至少在我的 dockerized 设置中,重新加载代码的块永远不会执行。
ruby-on-rails - Zeitwerk 和嵌套在类中的模块
我在使用 Rails 应用程序从经典的自动加载器切换到 Zeitwerk 时遇到了一些麻烦,该应用程序在 Rails 3 天里就已经出现了——所以那里有一些硬壳。
一些模型代码已被提取到模块中,这些模块嵌套在模型类(充当命名空间)中:
然后在需要时动态使用这些模块:
由于默认情况下不添加子目录app/models
,因此它在 中明确完成application.rb
:
Zeitwerkeager_load_paths
需要这些(根据 Rails 指南),但是,Zeitwerk 似乎不喜欢这个星座:
奇怪,因为Download
是在那里定义的。知道这里发生了什么以及如何最好地重构事物以与 Zeitwerk 一起工作吗?
感谢您的提示!
ruby-on-rails - Rails 7活动作业的自动加载问题
我的 Rails 7 应用程序中有一个应用程序目录 app/beer,在该文件夹中有一个名为 cool.rb 的文件,其中定义了执行方法。
因此,在 ActiveJob DrinkSudsJob执行方法中,我从cool.rb 调用方法执行为:
但是我的应用程序爆炸了。告诉我统一常量 DrinkSudsJob::Beer
Zeitwerk:check 告诉我一切都很好。我在这里做错了什么?
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/**/"]
,如果您需要更多信息,请告诉我。
ruby-on-rails - 启用 zeitwerk 后重新加载时未初始化的常量
从 Classic 迁移到 Zeitwerk 时遇到了一些麻烦。
启用 zeitwerk 和 running 后rails s
,一切似乎都正常。然后在保存 .rb 文件并刷新后,我在尝试从顶层请求文件时看到“未初始化的常量”错误/lib
。
重新加载时配置错误,但我正在挠头试图找出细节。我的印象是拥有一个顶级/lib
文件夹很好,并且require
用于在该目录中加载文件与 Zeitwerk 兼容,但现在我不太确定......关于我出错的想法?
注意:我目前没有设置任何特定eager_load_paths
或autoload_paths
编辑:按照@Xavier的建议更新日志输出