29
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsのautoloadについて(初心者向け)

Last updated at Posted at 2019-11-03

Railsのautoloadについて(初心者向け)

通常のRubyでは自分で作成したRubyプログラム(クラスの定義など)を読み込む場合もrequireを使います。

例)

dog_class
class Dog
  class << self
    def bark
      p 'Wan'
    end
  end
  def run
    p 'buuun'
  end
end
main

# 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クラスの場合はApplicationControlapp/controllersに含まれており、 hogeクラスapp/modelsに含まれています。

よって、事前にクラスをautoloadしてくれおりHogeクラスにはrequire文が必要ありません。

このautoloadに含まれていないクラスを読み込み場合はrequireが必要になります。

まとめ

前からRailsのrequireする時としない時の使い分けがわからなかったので調べてみました。
間違いがあれば、訂正をしていただけると幸いです。

参考

29
14
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
29
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?