動機
Railsチュートリアル7章まで進めて、ふとこの疑問が湧き上がりました。Rubyの基本的な文法を学習した段階では、
- 原則同じファイル内で定義したクラスしか使えない
- 外部のファイルのクラスを使う場合はrequireで読み込む必要がある
- クラスの継承を使えば、親クラスのメソッドも使用できる
- ファイル内にUserクラスの定義がない
- にもかかわらず@user = User.find(params[:id])みたいな感じでUserクラスを使ってる
- requireで外部ファイルを読み込んでる、もしくはクラスを継承している様子もない
Rails の自動読み込み(autoload)
という機能が働いていたようです。RailsガイドのRails の[自動読み込みと再読み込み] に記載がありました。 内容は初学者的には結構難しかったのですが、今の段階で理解できたことは、
- Zeitwerkというローダーのおかげで自動読み込みが実現できている。
- ファイル内で定義された定数(クラス名、モジュール名)と定義しているファイル名が一致していないと、Zeitwerkで読み込んでくれない(Userクラスを自動で読み込んで欲しいなら、user.rbってファイル名でファイル作ってそこでUserクラス定義しといてね)
- config.autoload_pathsに自動読み込みの対象となるディレクトリを指定してやる。
- デフォルトの読み込み対象はappディレクトリ以下のすべてのサブディレクトリ(assets、javascript、viewsは除く)