はい。タイトルの通りです。
仕事中、Rails6を使っているプロダクトでモデルの共通処理をConcernへ切り出そうとしたところ、 何度やってもオートロードに失敗してしまっているかのように見える事象に遭遇しました。
# app/models/concerns/models/hogerable.rb module Concerns::Models::Hogerable extend ActiveSupport::Concern 中略 end # app/models/concerns/models/hogerable.rb class Article < ApplicationRecord include Concerns::Models::Hogerable #=> オートロード失敗 end
Rails5ではこれで正しくロードできていたはず。
しかしRails6である今編集しているプロダクトでは現に動いておらず、またRails6でオートロードの探索ルールが変わっているのは知っていたのでその辺りに手掛かりがあるはず。
結論としてはRails6.0へのアップグレードガイドに答えが書いてありました。
Concerns::名前空間は、classicモードのオートローダーでは実装の副作用によって動作していましたが、これは意図した動作ではありませんでした。
Concerns::を使っているアプリケーションがzeitwerkモードで動くようにするには、こうしたクラスやモジュールをリネームする必要があります。
Rails アップグレードガイド - Railsガイド
concenrsディレクトリ以下に置いたconcernをConcerns名前空間配下として呼び出せるのは実装都合の副作用だったのか…
今まで /app/models
などの、appディレクトリと更に一階層取り除いた後のファイルパスから名前空間上の位置を組み立てられる、という解釈をしていましたが、
Rails.config.autoload_paths
から得られるオートロードで探索するパスを取り除いた後のパスから名前空間上の位置を組み立てられる、というのが正しかったようです。
Rails5と6両方触る人は混乱するかと思いますので注意しましょう。