Railsのautoloadについて(初心者向け)
通常のRubyでは自分で作成したRubyプログラム(クラスの定義など)を読み込む場合もrequireを使います。
例)
class Dog
class << self
def bark
p 'Wan'
end
end
def run
p 'buuun'
end
end
# requireが必要。理由はDogClassとmain文が別になっている為。
require './dog_class ' # 追加
Dog.bark -> 'Wan'
dog = Dog.new()
dog.run -> 'buuun'
Railsの場合は
しかしRailsの場合はrequireを書く必要がない時があります。
例) Railsのコントローラクラス
class HogeController < ApplicationController
def index
@hoges = Hoge.all
end
end
この場合、ApplicationControllerクラスやhogeクラスを利用しているので本来であれば以下のように記載する必要がありませんか?
# 継承元のapplication_controller
require "application_controller"
# Hogeモデルクラス
require "hoge"
class HogeController < ApplicationController
def index
@hoges = Hoge.all
end
end
でもRailsではrequireをわざわざ書く必要はありません。...... なんで????
理由はRailsのautoload機能を利用しているからです。
Railsのautoload
Railsのautoloadとは**「命名規則に則ったファイルを自動でrequireしてくれる機能」のことです。**
クラス名をキャメルケース(userItemのように2語目の先頭が大文字)で記述したり、
ファイル名をスネークケース(user_itemsのように単語と単語をアンダーバーで繋ぐ)で記述する等の規則に
準じて命名されたファイルをautoでrequireしてくれるというわけです。
Railsでlibディレクトリをautoload対象に含める方法
標準でautoload_pathsに含まれるのは以下の6ディレクトリになります。
app/controllers
app/models
app/helpers
app/mailers
app/controllers/concerns
app/models/concerns
上記で例としてあげたHogeクラスの場合はApplicationControl
はapp/controllers
に含まれており、 hogeクラス
はapp/models
に含まれています。
よって、事前にクラスをautoloadしてくれおりHogeクラスにはrequire文が必要ありません。
このautoloadに含まれていないクラスを読み込み場合はrequireが必要になります。
まとめ
前からRailsのrequireする時としない時の使い分けがわからなかったので調べてみました。
間違いがあれば、訂正をしていただけると幸いです。
参考