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

如何解决Rails 6 Zeitwerk“弃用警告:初始化自动加载常量......”但我不知道在哪里?

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

我正在努力升级一个最初是 Rails 5.2 的应用

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

DEPRECATION WARNING: Initialization autoloaded the constants ApplicationHelper,EventsHelper,FontAwesome::Rails::IconHelper,DeviseHelper,ErrorHandler,and ApplicationController.

Being able to do this is deprecated. Autoloading during initialization is going
to be an error condition in future versions of Rails.

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

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

我查找了可能会为这些常量调用 includerequire 的实例,但没有找到。我特别关注我的初始化程序。

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

...
Zeitwerk@rails.main: constant ApplicationHelper loaded from file /Users/ckragt/ruby/filterbuildscheduler/app/helpers/application_helper.rb
...
Zeitwerk@rails.main: constant EventsHelper loaded from file /Users/ckragt/ruby/filterbuildscheduler/app/helpers/events_helper.rb
...
Zeitwerk@rails.main: constant FontAwesome::Rails::IconHelper loaded from file /Users/ckragt/.rvm/gems/ruby-2.7.0/gems/font-awesome-rails-4.7.0.7/app/helpers/font_awesome/rails/icon_helper.rb
...
Zeitwerk@rails.main: constant DeviseHelper loaded from file /Users/ckragt/.rvm/gems/ruby-2.7.0/gems/devise-4.7.3/app/helpers/devise_helper.rb
...
Zeitwerk@rails.main: constant ErrorHandler loaded from file /Users/ckragt/ruby/filterbuildscheduler/app/controllers/concerns/error_handler.rb
...
Zeitwerk@rails.main: autoload set for ApplicationController,to be loaded from /Users/ckragt/ruby/filterbuildscheduler/app/controllers/application_controller.rb

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

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

# frozen_string_literal: true

require_relative 'boot'
require 'csv'

require 'rails'
# Pick the frameworks you want:
require 'active_model/railtie'
require 'active_job/railtie'
require 'active_record/railtie'
# require "active_storage/engine"
require 'action_controller/railtie'
require 'action_mailer/railtie'
# require 'action_mailBox/engine'
# require 'action_text/engine'
require 'action_view/railtie'
# require 'action_cable/engine'
require 'sprockets/railtie'
# require 'rails/test_unit/railtie'

require 'google/apis/gmail_v1'
require 'google/api_client/client_secrets'

# Require the gems listed in Gemfile,including any gems
# you've limited to :test,:development,or :production.
Bundler.require(*Rails.groups)

module Buildplanner
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0
...

对我应该去哪里看看有什么想法吗?

解决方法

事实证明这似乎与rails_admin有关。

我是如何了解到这一点的:

Someone else 分享了我对警告消息的不满,并寻求更多帮助来追踪问题。

One response 建议将 pp caller_locations 放在正在自动加载的文件之一的顶部。这样做给了我一个可以使用的回溯。那时我注意到 rails_admin 出现在每个路径中。

我注意到我已经在 require 中有大量的 config/initializers/rails_admin.rb 语句:

require 'money-rails/rails_admin'
require 'rails_admin/adapters/active_record'
require 'application_record'
require 'user'
require 'event'
require 'registration'
require 'location'
require 'technology'
require 'supplier'
require 'component'
require 'part'
require 'material'
require 'count'
require 'inventory'
require 'extrapolate_component_part'
require 'extrapolate_material_part'
require 'extrapolate_technology_component'
require 'extrapolate_technology_part'
require 'extrapolate_technology_material'

对于百灵鸟,我将它们全部注释掉,然后进行了 RSpec 测试。我的警告信息突然变得很长,还有更多的实例:

DEPRECATION WARNING: Initialization autoloaded the constants ApplicationHelper,EventsHelper,FontAwesome::Rails::IconHelper,DeviseHelper,ErrorHandler,ApplicationController,ApplicationRecord,User,Event,Registration,Location,Technology,Component,Part,Material,Supplier,Count,Inventory,ExtrapolateComponentPart,ExtrapolateMaterialPart,ExtrapolateTechnologyComponent,ExtrapolateTechnologyPart,and ExtrapolateTechnologyMaterial.

所以我决定在我之前的实例中添加:

require 'application_helper'
require 'events_helper'
require 'devise_helper'
require 'error_handler'
require 'application_controller'

...对于我已经很长的列表,我的警告信息,除了 FontAwesome::Rails::IconHelper 之外的所有内容都消失了。如果我能找出正确的文件路径,我想我也可以得到那个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?