Railsのapp以下のファイルで自動読み込みが効かない時
概要
このトラブルは、Service層などの新たな設計をappディレクトリ配下に実装する際によく直面する 自動読み込みが効いていない時に確認する項目を下記に記述する
ActiveSupport::Dependencies.autoload_pathsの確認
自動で読み込んでくれるファイルパスがどうなっているのかは下記のプログラムにて確認できる
rails cを起動して叩けばいい。
ActiveSupport::Dependencies.autoload_paths
app以下のディレクトリなら自動的に全て登録されている。
ここに入っていないのであれば、autoload_pathsが開発者の手によって操作されている可能性が高い。
config/initializersディレクトリなどに関連するコードがないかどうかを調べよう。
.autoload_pathsにいるけど読み込まれない。
恐らく、namespace絡みのトラブルにハマっている。
Railsは無作法者には厳しいのでしっかりと規則を守らないとファイルの自動読み込みは効かなくなる。
[ 自動読み込みが効く例 ]
ファイルパス: app/service/user_service.rb
class UserService ... end
[ 自動読み込みが効く例2 ]
ファイルパス: app/service/service/user_service.rb
module Service class UserService ... end end
[ 自動読み込みが効かない例 ]
ファイルパス: app/service/user_service.rb
module Service class UserService ... end end
bootsnapのchacheが効いている
挙動がおかしい、何をやっても治らない場合は一度キャッシュ周りを調査する。
boot.rbに以下のようなコードがないかチェック。
require 'bootsnap' env = ENV['RAILS_ENV'] || "development" Bootsnap.setup( cache_dir: 'tmp/cache', development_mode: env == 'development', load_path_cache: true, autoload_paths_cache: true, disable_trace: true, compile_cache_iseq: true, compile_cache_yaml: true )
load_path_cacheやautoload_paths_cacheをfalseにするとなおる事がある。