问题标签 [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 投票
1 回答
2875 浏览

ruby - Rails 6自动加载未找到类

我正在尝试从 Rails 5 升级到 6。我执行了升级步骤,包括添加以下内容:

我有这堂课:

在任务中使用:

当我这样做时puts config.autoload_paths,它会被列出,所以我希望它会自动加载:

/my/app/path/lib/notification/auto_thank.rb

但是当我运行任务时出现错误:

NameError:未初始化的常量通知

它变得陌生。当我向任务添加要求时:

我得到一个不同的错误:

NameError:预期文件 /my/app/path/lib/notification/auto_thank.rb 来定义常量 AutoThank,但没有

我错过了什么?

0 投票
1 回答
986 浏览

ruby-on-rails - 如何在 Rails 6/Zeitwerk 中扩展 gem 类而不破坏代码重新加载?

当我使用 rails 6 / zeitwerk 时,如何扩展由 gem 定义的类?

我已经尝试在初始化程序中使用它require首先加载类。我已经尝试在初始化程序中执行此操作,并且只是引用该类以让自动加载首先加载它。

但是这两种方法都破坏了开发模式下的自动重新加载。

我已经尝试将它放入lib/or app/,但这不起作用,因为那时该类永远不会从 gem 中加载,因为我的新文件在加载顺序中更高。

这里有一个类似的问题,但这个问题专门询问如何在初始化程序中执行此操作。我不在乎它是否在初始化程序中完成,我只想弄清楚如何以某种方式做到这一点。

做这样的事情的标准方法是什么?

我确实有一个讨厌的黑客似乎正在工作,但我不喜欢它(更新:这也不起作用。重新加载仍然被破坏):

0 投票
3 回答
1884 浏览

autoload - Rails 6+、zeitwerk 自动加载器和命名空间常量

Rails 6+ 默认的自动加载器是 zeitwerk,这似乎比以前的方法有了很大的改进。

但是,zeitwork 遵循 Rails 项目的约定,其中的任何内容app/*都是自动加载的,不需要命名空间。

这非常有用,app/models/user.rb因为您不必使用Models::User但可以参考User.

但是,我添加了自己的app/services目录并将我的服务对象命名为Services::Users::Create,这将映射到app/services/users/create.rb.

Zeitwork 抛出了我的类常量不存在的错误,因为它是预期Users::Create的(没有Services::前缀)。

无论如何配置 zeitwork 以Services::在这些实例中需要命名空间?Services::Users::Create在我看来,阅读代码并知道您正在查看app/services/users/create.rb文件会更干净。

如果您刚刚拥有Users::Create,一般的 Rails 开发人员可能会查找该app/models/users/create.rb文件。

我不喜欢命名它的方法Users::CreateService,这对我来说似乎很不雅。

我不能是唯一一个使用这样的约定的人;有没有其他人遇到过解决方案?我仍在浏览所有 zeitwerk 文档以寻找解决方案,但还没有找到解决方案。

0 投票
1 回答
388 浏览

ruby-on-rails - rails 6 app 测试为绿色,但在生产中出现奇怪的效果:LoadError(无法加载此类文件——rb-readline)

部署一个经过绿色测试的 rails 6 应用程序。

当然,部署后生产中的预期行为与生产中的行为相同。

但是,在生产中,启动时失败,结果如下:

rb-readline 存在于 Gemfile 中:

要求的顺序是:

开发模式没有问题。仅在生产模式下失败。

生产环境总结:

我难住了。

生产 gem env 输出是:

我仍然很难过。

0 投票
2 回答
11033 浏览

ruby-on-rails - ERROR: Error installing rails zeitwerk requires Ruby version >= 2.4.4

I recently changed my laptop and tried installing rails with

and I got this error

I have installed ruby version 2.4.4, 2.5.7, and 2.6.5 and I'm still getting the same error. Any pointers how to resolve this will be greatly appreciated. thanks

0 投票
1 回答
633 浏览

ruby-on-rails - NoMethodError:未定义的方法 `eager_load_paths' 用于#

在我运行 ruby​​ 2.7 的 rails 6 应用程序中,我试图使用 Zeitwerk 急切加载所有文件。这是我的 application.rb 文件的片段:

结尾

但是,当我运行它时,我得到了这个错误:

对此的任何解决方案都会有所帮助

0 投票
2 回答
2217 浏览

ruby-on-rails - 切换到 Zeitwerk 时出现未初始化的常量错误

我目前在目录中有以下文件jobs

使用经典代码加载器可以正常工作,但是在切换到 ZeitwerkNameError: uninitialized constant Importer::CustomImportJob时,运行时出现错误rails zeitwerk:check

我尝试移动custom_import_job.rb到该jobs目录,但仍然收到相同的错误。添加app/jobs/importerconfig.autoload_paths也没有帮助。

文件结构有问题还是我在 Zeitwerk 设置中遗漏了什么?

0 投票
2 回答
1283 浏览

ruby-on-rails - Rails 6 Zeitwerk 在初始化程序后卸载我的类

我正在使用 Zeitwerk 加载器在 Rails 6 应用程序中实现一个单例类/模块。

单例类在初始化

然后当我在控制器中使用单例类时

它返回一个空对象,因为它没有被初始化:client == "default_value" 但应该是 "my_custom_value"。

日志显示错误

使用 Zeitwerk 时如何正确配置单例类?

0 投票
1 回答
212 浏览

ruby-on-rails - 无法在 Rails6 中自动加载类

我想将自定义类添加到 app 文件夹到干净的 Rails 6 项目 ruby​​ 2.7.0 中。根据 Zeitwerk 文档,它应该自动加载 app 目录下的所有路径。

我在 Rails 控制台中遇到错误

怎么了?

注意:当我将 car.rb 放到 app/models 中时,它可以正常工作,但在 app/custom 目录中时则不行

0 投票
1 回答
201 浏览

ruby-on-rails - Rails 自定义项目结构自动加载配置

我有一个标准应用程序,其中包含我们将慢慢迁移到单独的 gem 中的子应用程序。主要问题是每个子应用程序基本上具有几乎相同的架构和非常相似的业务逻辑,有时实际上几乎相同。

目前,作为第一步,我们创建了一个子文件夹,lib/client其结构类似于典型的 Rails 应用程序。

例如,对 a 的关注ClientA看起来像这样/

这一切都很好,并由 Zeitwerk 自动加载。

但是,当我想以 Rails 方式创建初始化程序时,我不想将它包装在模块中并围绕它创建一个类,这就是我得到的地方lib/clients/ClientA/config/initializers/custom_initializer.rb to define constant Clients::ClientA::Config::Initializers::CustomInitializer, but didn't (Zeitwerk::NameError)

这个文件夹会像这样自动加载

有没有办法如何

  • 将 Zeitwerk 自动加载的文件夹列入黑名单?
  • 使用或以任何其他方式加载它require而不将其包装在模块中?