ruby-on-railsruby-on-rails-6zeitwerk

Rails 6 Zeitwerk "DEPRECATION WARNING: Initialization autoloaded the constants..." but I can't figure out where?


I swear I've read the docs and I think I have a basic understanding of the principles, but I can't for the life of me figure out where I'm loading these constants inappropriately.

I'm working to upgrade an app that was originally Rails 5.2

I'm getting this warning when I run RSpec, a server, a local console, etc.

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.

Here are the constants that are being inappropriately autoloaded:

  • ApplicationHelper - standard Rails file
  • EventsHelper - standard Rails file for EventsController
  • FontAwesome::Rails::IconHelper - from a gem, not in my app directory
  • DeviseHelper - from a gem, not in my app directory
  • ErrorHandler - Located at 'app/controllers/concerns/error_handler'
  • ApplicationController - standard Rails file

I've looked for instances where I might be calling include or require for these constants, but found none. I especially focused on my initializers.

I've run (and read through) bin/rails zeitwerk:check without any obvious hints. I see these instances getting loaded as expected:

...
[email protected]: constant ApplicationHelper loaded from file /Users/ckragt/ruby/filterbuildscheduler/app/helpers/application_helper.rb
...
[email protected]: constant EventsHelper loaded from file /Users/ckragt/ruby/filterbuildscheduler/app/helpers/events_helper.rb
...
[email protected]: 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
...
[email protected]: constant DeviseHelper loaded from file /Users/ckragt/.rvm/gems/ruby-2.7.0/gems/devise-4.7.3/app/helpers/devise_helper.rb
...
[email protected]: constant ErrorHandler loaded from file /Users/ckragt/ruby/filterbuildscheduler/app/controllers/concerns/error_handler.rb
...
[email protected]: autoload set for ApplicationController, to be loaded from /Users/ckragt/ruby/filterbuildscheduler/app/controllers/application_controller.rb

I am using Spring and Binstub (both updated to latest versions).

Here's the top of my application.rb file:

# 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
...

Any ideas of where else I should look?


Solution

  • Turns out this seems to be related to rails_admin.

    How I learned this:

    Someone else shared my frustration at the warning message and asked for more help tracing the issue.

    One response recommended putting pp caller_locations at the top of one of the files that was being autoloaded. Doing this gave me a traceback I could use. That's when I noticed that rails_admin appeared as a path in each one.

    I noticed I already had a huge list of require statements in 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'
    

    For a lark, I commented all of them out, then ran a RSpec test. My warning message suddenly got SUPER long with a bunch more instances:

    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.
    

    So I decided to add in my previous instances:

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

    ...to my already long list, my warning message, all of them but the FontAwesome::Rails::IconHelper goes away. I think I can get that one too, if I can just figure out the correct filepath.