问题标签 [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 回答
804 浏览

ruby-on-rails - 生产环境中设计邮件程序的 Zeitwerk 错误

我有 Rails 6,我的预览课位于

mailer/previews/devise_mailer_preview.rb

当我在本地运行应用程序时,一切正常,我可以在http://localhost:3000/rails/mailers/devise_mailer/confirmation_instructions地址上看到我的电子邮件预览。但是现在我尝试在服务器上部署应用程序,发现运行时bundle exec rails c production出现错误:

/home/deploy/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/zeitwerk-2.3.0/lib/zeitwerk/loader/callbacks.rb:17:in `on_file_autoloaded': 预期文件 /home/deploy/project/releases/20200627024908/app/mailer/previews/devise_mailer_preview.rb 定义常量 Previews::DeviseMailerPreview,但没有(Zeitwerk::NameError)

之后,我在本地检查过RAILS_ENV=production rails c,并且得到了相同的结果。

如果我将 DeviseMailerPreview 类重命名为 Previews::DeviseMailerPreview,它将被破坏并且我看不到开发中的电子邮件,因为 Rails 6 与docs相对应,期望正是该名称。

更重要的是,我在这篇文章中发现,可以使用参数配置 zeitwerkautoload_paths以避免 ruby​​ 的 NameError。我发现我有我的config/application.rb

无论如何,我尝试在我的config/environments/production.rb文件中添加相同的行,但它没有帮助。

我做错了什么,我该如何解决?提前致谢!

0 投票
2 回答
1275 浏览

ruby-on-rails - 使用 Zeitwerk 自动加载器在 Rails 6 中命名空间服务对象

Rails 6 切换到 Zeitwerk 作为默认的自动加载器。Zeitwerk 将加载 /app 文件夹中的所有文件,无需命名空间。这意味着,现在可以直接调用 app/services/demo/test_service.rb 中的 TestService 服务对象,例如TestService.new().call

然而,命名空间有助于在更复杂的 Rails 应用程序中组织对象,例如API::UsersController,或者对于我们使用 Registration::CreateAccount、Registration::AddDemoData 等的服务。

rails 指南建议的一种解决方案是从 application.rb 中的自动加载器路径中删除路径,例如config.autoload_paths -= Dir["#{config.root}/app/services/demo/"]. 然而,这感觉就像一个猴子补丁,用于硬塞旧方式或将对象组织到新的轨道方式中。

命名空间对象的正确方法或组织它的 rails 6 方法是什么,而不仅仅是强制 rails 进入旧方式?

0 投票
2 回答
1355 浏览

javascript - javascript的Rails Zeitwerk`错误的常量名称`

使用 Rails 6

我有一个这样的文件夹app/client/javascript/config/editor/syntax-highlighting

里面有2个文件。

app/client/javascript/config/editor/syntax-highlighting/math-mode.js app/client/javascript/config/editor/syntax-highlighting/units-regex.js

当我部署到生产时,错误消息是:

Wrong constant name Syntax-Highlighting inferred by Module from directory (Zeitwerk::NameError)

它提供了该目录的路径。 app/client/javascript/config/editor/syntax-highlighting

这个错误的原因是什么?

0 投票
2 回答
1105 浏览

ruby-on-rails - 升级到 Rails 6 时有一种编程方式来检测 Zeitwerk::NameError?

我目前正在将旧的 Rails 应用程序迁移到 Rails 6。

项目中的某些文件似乎与其中定义的类不一致。运行应用程序测试时我没有看到此错误,但在部署后我收到如下错误:

在之前的 SO 问题中,我可以找到以下建议:

我不是在寻找解决方法,所以我更正了引发异常的文件。

我想找到一种编程方式来检测所有不一致的路径/类名,而无需在生产模式下运行应用程序。

到目前为止,我想到了三个选项:

  1. 用于验证自动加载的 rake 任务(gem 不提供)。它存在吗?您是否有一个片段可以从开发环境中的 rails 控制台运行?
  2. 一个 rubocop 警察或其他静态代码分析器。有吗?
  3. 在测试环境中强制进行急切加载

在不需要多次迭代/部署的情况下验证我的代码的建议方法是什么?

非常感谢你

0 投票
1 回答
546 浏览

ruby-on-rails - 自动/急切加载 /app 之外的目录

在 Rails 应用程序(Rails 6)中,我在 Rails 应用程序的根目录中创建了一个目录 - 在/app文件夹之外。我想尝试在 Rails Web 框架之外保留一些逻辑。

check_record.rb 文件

现在我无法在测试(RSpec)和开发(rails 控制台)环境中自动加载这个目录。

当我尝试application.rb

由于未初始化的常量#Class:0x00007f96e1f1ad90::MyDomain
尝试在 Rails 控制台中访问类时收到相同的错误,测试失败

当我尝试application.rb

我可以看到该文件夹​​中的所有文件都已注册Rails.configuration.eager_load_paths,但测试失败并显示相同的错误消息

当我将此代码移动到专用初始化程序类相同的输出或运行 Rails 控制台初始化程序时根本没有加载。

域类型的用法:

如何在文件夹外使用 ruby​​ 文件急切或自动加载目录/app

0 投票
1 回答
254 浏览

ruby-on-rails - 使用 Rails 6 Zeitwerk 时,具有相同名称的类会导致未初始化的常量

我在使用zeitwerk时遇到问题,我无法访问另一个具有相同名称的模型常量。例如:

/app/models我有worker.rb一个常量的文件RETRY_COUNT

/lib我有一个/critical/worker.rb文件但命名空间在critical

我可以使用 调用工人模型类::Worker,但是当我调用时::RETRY_COUNT,它会导致

无论如何围绕这个?我可以RETRY_COUNTCritical::Worker课堂上硬编码,但我想避免这样做。

0 投票
1 回答
1506 浏览

ruby-on-rails - Rails 6 Zeitwerk“弃用警告:初始化自动加载常量......”但我不知道在哪里?

我发誓我已经阅读了这些文档,并且我认为我对这些原则有基本的了解,但我一生都无法弄清楚我在哪里不恰当地加载了这些常量。

我正在努力升级最初是 Rails 5.2 的应用程序

我在运行 RSpec、服务器、本地控制台等时收到此警告。

以下是不恰当地自动加载的常量:

  • ApplicationHelper - 标准 Rails 文件
  • EventsHelper - EventsController 的标准 Rails 文件
  • FontAwesome::Rails::IconHelper -来自 gem,不在我的应用程序目录中
  • DeviseHelper -来自 gem,不在我的应用程序目录中
  • ErrorHandler -位于 'app/controllers/concerns/error_handler'
  • ApplicationController -标准 Rails 文件

我已经寻找我可能正在调用的实例includerequire这些常量,但没有找到。我特别关注我的初始化程序。

我已经运行(并通读)bin/rails zeitwerk:check没有任何明显的提示。我看到这些实例按预期加载:

我正在使用 Spring 和 Binstub(都更新到最新版本)。

application.rb这是我文件的顶部:

关于我应该在哪里看的任何想法?

0 投票
1 回答
75 浏览

ruby-on-rails - Heroku 应用程序部署成功,但在加载站点时收到应用程序错误

M 打开应用程序时收到以下错误消息............应用程序发生错误,无法提供您的页面。如果您是应用程序所有者,请查看您的日志以了解详细信息。您可以从 Heroku CLI 使用命令 heroku logs --tail 执行此操作

这是日志...我在这里缺少什么???

0 投票
0 回答
254 浏览

ruby-on-rails-6 - 在 Rails 6 中更改文件后 Active Model Serializer 自动重新加载的问题

我在子文件夹中创建了一个文件app/decorators

并定义了序列化程序:

当我更改方法def urlRails 6 重新加载模型但没有重新加载序列化程序时,我需要重新启动服务器。

我试图添加一个子文件夹,autoload_paths但不幸的是,它没有帮助:

另外,我尝试应用这些答案,但没有任何帮助:

Rails 不检测文件更改并且 config.reload_classes_only_on_change 使服务器太慢

自定义文件夹不会在 Rails 6 中自动重新加载

活动模型序列化程序不适用于 rails-api gem

附言

导轨 6.1.0

红宝石 2.7.2p137

0 投票
1 回答
87 浏览

ruby-on-rails - Rails 6:更改时自动重新加载本地 gem

我正在并行开发 Rails 6 应用程序和 Gem。

过去,我使用了require_reloader Gem,这样当 Gem 的本地目录中的任何文件发生更改时,Rails 都会重新加载 Gem。

随着 Zeitwerk 成为 Rails 6 中的新加载程序,这个 Gem 似乎不再工作了。

所以我的问题是:并行开发 Gem 和 Rails 6 应用程序以便对 Gem 文件所做的更改在 Rails 中自动可见的规范方法是什么?