问题标签 [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 - 生产环境中设计邮件程序的 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文件中添加相同的行,但它没有帮助。
我做错了什么,我该如何解决?提前致谢!
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 进入旧方式?
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
这个错误的原因是什么?
ruby-on-rails - 升级到 Rails 6 时有一种编程方式来检测 Zeitwerk::NameError?
我目前正在将旧的 Rails 应用程序迁移到 Rails 6。
项目中的某些文件似乎与其中定义的类不一致。运行应用程序测试时我没有看到此错误,但在部署后我收到如下错误:
在之前的 SO 问题中,我可以找到以下建议:
- Rails 6:Zeitwerk::NameError 不从模块集中加载类
config.autoloader = :classic
- 如何忽略 Zeitwerk for Rails 6 中的文件夹?忽略给定的路径
- Rails 6 中的自动加载和 Zeitwerk 模式调整
config.autoload_path
我不是在寻找解决方法,所以我更正了引发异常的文件。
我想找到一种编程方式来检测所有不一致的路径/类名,而无需在生产模式下运行应用程序。
到目前为止,我想到了三个选项:
- 用于验证自动加载的 rake 任务(gem 不提供)。它存在吗?您是否有一个片段可以从开发环境中的 rails 控制台运行?
- 一个 rubocop 警察或其他静态代码分析器。有吗?
- 在测试环境中强制进行急切加载
在不需要多次迭代/部署的情况下验证我的代码的建议方法是什么?
非常感谢你
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
?
ruby-on-rails - 使用 Rails 6 Zeitwerk 时,具有相同名称的类会导致未初始化的常量
我在使用zeitwerk时遇到问题,我无法访问另一个具有相同名称的模型常量。例如:
在/app/models
我有worker.rb
一个常量的文件RETRY_COUNT
在/lib
我有一个/critical/worker.rb
文件但命名空间在critical
我可以使用 调用工人模型类::Worker
,但是当我调用时::RETRY_COUNT
,它会导致
无论如何围绕这个?我可以RETRY_COUNT
在Critical::Worker
课堂上硬编码,但我想避免这样做。
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 文件
我已经寻找我可能正在调用的实例include
或require
这些常量,但没有找到。我特别关注我的初始化程序。
我已经运行(并通读)bin/rails zeitwerk:check
没有任何明显的提示。我看到这些实例按预期加载:
我正在使用 Spring 和 Binstub(都更新到最新版本)。
application.rb
这是我文件的顶部:
关于我应该在哪里看的任何想法?
ruby-on-rails - Heroku 应用程序部署成功,但在加载站点时收到应用程序错误
M 打开应用程序时收到以下错误消息............应用程序发生错误,无法提供您的页面。如果您是应用程序所有者,请查看您的日志以了解详细信息。您可以从 Heroku CLI 使用命令 heroku logs --tail 执行此操作
这是日志...我在这里缺少什么???
ruby-on-rails-6 - 在 Rails 6 中更改文件后 Active Model Serializer 自动重新加载的问题
我在子文件夹中创建了一个文件app/decorators
并定义了序列化程序:
当我更改方法def url
Rails 6 重新加载模型但没有重新加载序列化程序时,我需要重新启动服务器。
我试图添加一个子文件夹,autoload_paths
但不幸的是,它没有帮助:
另外,我尝试应用这些答案,但没有任何帮助:
Rails 不检测文件更改并且 config.reload_classes_only_on_change 使服务器太慢
附言
导轨 6.1.0
红宝石 2.7.2p137
ruby-on-rails - Rails 6:更改时自动重新加载本地 gem
我正在并行开发 Rails 6 应用程序和 Gem。
过去,我使用了require_reloader Gem,这样当 Gem 的本地目录中的任何文件发生更改时,Rails 都会重新加载 Gem。
随着 Zeitwerk 成为 Rails 6 中的新加载程序,这个 Gem 似乎不再工作了。
所以我的问题是:并行开发 Gem 和 Rails 6 应用程序以便对 Gem 文件所做的更改在 Rails 中自动可见的规范方法是什么?