Help us understand the problem. What is going on with this article?

Rails 6に上げると”DEPRECATION WARNING: Initialization autoloaded the constants ActionText::ContentHelper, and ActionText::TagHelper.”のような警告が出る

対応不要なRails本体のissue

Rails 5.2のアプリケーションを6.0.0に上げて、テストを実行したところ、以下のような警告が出ました。

DEPRECATION WARNING: Initialization autoloaded the constants ActionText::ContentHelper, and ActionText::TagHelper.

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

Reloading does not reboot the application, and therefore code executed during
initialization does not run again. So, if you reload PageDescription, for example,
the expected changes won't be reflected in that stale Class object.

`config.autoloader` is set to `classic`. These autoloaded constants would have been unloaded if `config.autoloader` had been set to `:zeitwerk`.

Please, check the "Autoloading and Reloading Constants" guide for solutions.
 (called from <main> at /Users/jnito/dev/private/cb/config/environment.rb:5)

結論から先に言うと、この警告はRails本体側のissueなので対応は不要です。

Misleading deprecation warning when referencing ActionController::Base · Issue #36546 · rails/rails

Rails 6.0.0では発生しますが、おそらくこの先のアップデートで修正され、近い将来この警告は出なくなるものと思われます。

警告の原因はRails 6で導入された新しいオートロードシステムの影響

なお、この警告はRails 6から導入された、Zeitwerk(ツァイトベルク)という新しいオートロードシステムの影響で発生します。

Autoloading and Reloading Constants (Zeitwerk Mode) — Ruby on Rails Guides

修正が必要な場合

ただし、警告メッセージにActionText::ContentHelper と ActionText::TagHelper 以外の定数(クラス名)が出力されている場合は修正が必要になります。

# Fooというクラスも表示されている
DEPRECATION WARNING: Initialization autoloaded the constants Foo, ActionText::ContentHelper, and ActionText::TagHelper.

僕のRailsプロジェクトではapp/models以下に置いていたActiveRecordではない、ただのRubyクラスをconfig/initializersで呼びだしているのが原因でした。

app/models/foo.rb
# ActiveRecordではない、プレーンなRubyクラス
class Foo
  def self.do_something
    # ...
  end
end
config/initializers/foo.rb
# app/models以下に置いた、ただのRubyクラスをconfig/initializersで呼びだすと警告が出る
Foo.do_something

修正方法

foo.rblib以下に移動し、initializersで明示的にrequireすることで警告が出なくなりました。

2020.3.30追記

あらためて試してみるとFooに関する警告は表示されていませんでした。
問題が再発しない状態で解決策だけ載せても意味がないので、以下の解決策はいったん取り下げます。

ちなみに、Rails.configuration.to_prepareでinitializersの処理を囲めば良い、という記事もあったので、この方法を使うと解決するかもしれません。

Today I Learned — October 16, 2019 @ danott.co

注意!!以下のコード例は適切な解決策ではないかも↓↓↓

# ファイルをlib以下に移動する
git mv app/models/foo.rb lib/
config/initializers/foo.rb
# libディレクトリに移動した上で、明示的にrequireすると警告が出なくなる
require 'foo'
Foo.do_something

参考情報

jnchito
SIer、社内SEを経て、ソニックガーデンに合流したプログラマ。 「プロを目指す人のためのRuby入門」の著者。 http://gihyo.jp/book/2017/978-4-7741-9397-7 および「Everyday Rails - RSpecによるRailsテスト入門」の翻訳者。 https://leanpub.com/everydayrailsrspec-jp
https://blog.jnito.com/
sonicgarden
「お客様に無駄遣いをさせない受託開発」と「習慣を変えるソフトウェアのサービス」に取り組んでいるソフトウェア企業
http://www.sonicgarden.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした