1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

なんでmodelで定義してるUserクラスをcontrollerで使えるの?

Last updated at Posted at 2024-01-02

動機

Railsチュートリアル7章まで進めて、ふとこの疑問が湧き上がりました。
Rubyの基本的な文法を学習した段階では、
  • 原則同じファイル内で定義したクラスしか使えない
  • 外部のファイルのクラスを使う場合はrequireで読み込む必要がある
  • クラスの継承を使えば、親クラスのメソッドも使用できる
という理解だったのですが、railsチュートリアルのsample_appのusers_controller.rbのコードを見ると
  • ファイル内にUserクラスの定義がない
  • にもかかわらず@user = User.find(params[:id])みたいな感じでUserクラスを使ってる
  • requireで外部ファイルを読み込んでる、もしくはクラスを継承している様子もない
みたいな感じでなぜUserクラスが使えているのか理解できなかったので調べてみました。

Rails の自動読み込み(autoload)

という機能が働いていたようです。
RailsガイドのRails の[自動読み込みと再読み込み] に記載がありました。 内容は初学者的には結構難しかったのですが、今の段階で理解できたことは、
  • Zeitwerkというローダーのおかげで自動読み込みが実現できている。
  • ファイル内で定義された定数(クラス名、モジュール名)と定義しているファイル名が一致していないと、Zeitwerkで読み込んでくれない(Userクラスを自動で読み込んで欲しいなら、user.rbってファイル名でファイル作ってそこでUserクラス定義しといてね)
  • config.autoload_pathsに自動読み込みの対象となるディレクトリを指定してやる。
  • デフォルトの読み込み対象はappディレクトリ以下のすべてのサブディレクトリ(assets、javascript、viewsは除く)
ということみたいです、詳しくはRailsガイドを参照くださいませ。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?