Ruby on Railsのファイル読み込みについて調べた

はじめに

Ruby on Railsを触っているうち、ふと、そういえばファイルによってrequireしたりしなかったりするけど、そのへんどうなってるんだろう?と疑問に思い、調べた。

前提

通常、Rubyプログラムのクラスは、依存関係のあるプログラムを明示的に読み込む必要がある。

例えば、Foo.rbにFooクラスを宣言したとして、それをBar.rbで使おうと思ったならば、requireでFoo.rbの内容をBar.rbに読み込む必要がある。

Railsでの例外?

ところが、Ruby on Railsを触っていると、一見、この前提の例外があるように見える。 例えば、モデルクラスは、使いたいファイル(例えばコントローラーファイル)にrequireで読み込まなくても使用できる。 これは、どういうことなのだろうか?

結論

Ruby on Railsには、「autoload機能」があるため。 これは、Rails命名規則に則ったファイルを自動でrequireしてくれる機能で、例えばクラス名をキャメルケースで記述したり、ファイル名をスネークケースで記述しておくと、それらを自動でrequireしてくれるというもの。

結果、autoload機能の対象となったRailsアプリケーションのクラスやモジュールはどこでも利用できる。

じゃあrequireしないといけないファイルってどれ?

例としては、Ruby標準ライブラリ、libディレクトリにあるもの、Ruby gemなどがある。

デフォルトでは「アプリケーションの起動時にappの下にあるすべてのサブディレクトリ(assets、javascripts、viewsは除外)と、アプリケーションが依存する可能性のあるエンジン」が自動読み込みの対象になっている。

自動読み込みの対象はカスタマイズできる?

できる。config/application.rbで以下のようにconfig.autoload_pathsに追加すれば良い。

module MyApplication
  class Application < Rails::Application
    config.autoload_paths << "#{root}/extras"
  end
end

感想

やはり読み込むための機能がちゃんとあった。 きちんと読み込むためには命名規則を守らなければいけないということも学べた。

きちんと定義したはずなのになんでこのクラス使えないんだろ??ってなったときは、自動読み込みがうまくいってない可能性も考えようと思う。

参考

定数の自動読み込みと再読み込み (Zeitwerk) - Railsガイド