Rails 6 Zeitwerk «ПРЕДУПРЕЖДЕНИЕ ОБ УСТАРЕВАНИИ: инициализация автоматически загрузила константы …», но я не могу понять, где?

#ruby-on-rails #ruby-on-rails-6 #zeitwerk

#ruby-on-rails #ruby-on-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 — стандартный файл Rails для EventsController
  • FontAwesome :: Rails::IconHelper — из драгоценного камня, а не из моего каталога приложений
  • DeviseHelper — из драгоценного камня, а не из моего каталога приложений
  • ErrorHandler — находится в ‘app / controllers / concerns / error_handler’
  • ApplicationController — стандартный файл Rails

Я искал случаи, когда я мог бы вызывать include или require для этих констант, но не нашел ни одной. Я особенно сосредоточился на своих инициализаторах.

Я запустил (и прочитал) 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
...
 

Есть идеи, где еще я должен искать?

Ответ №1:

Оказывается, это, похоже, связано rails_admin с.

Как я узнал об этом:

Кто-то еще разделил мое разочарование по поводу предупреждающего сообщения и попросил дополнительной помощи в отслеживании проблемы.

В одном ответе рекомендовалось поместить 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'
 

… к моему и без того длинному списку, моему предупреждающему сообщению, все они, кроме the FontAwesome::Rails::IconHelper , исчезают. Я думаю, что я тоже смогу это сделать, если смогу просто определить правильный путь к файлу.