スリ飯屋Malankaのフリーエンジニアな日々

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

【Rails5】自作のディレクトリを、autoload_pathsに追加して自動読み込みさせる

独自例外を定義したクラスを、autoloadさせたかったため。

手順

1、 アプリのrootにcustom_exceptionsディレクトリを作成する。

2、 custom_exceptions/custom_exceptions.rbを作成。

module CustomExceptions
  class HogeError < StandardError; end
end

命名規則は、

ファイル名はスネークケース(hoge_fuga_bar)
module名はパスカルケース(HogeFugaBar)

とする。

階層構造、ファイル名、呼び出し方は、

# 階層
- custom_exceptions(ディレクトリ)
  - custom_exceptions.rb

# ファイル名
custom_exceptions/custom_exceptions.rb

# 呼び出し
CustomExceptions::HogeError

3、 config/application.rbに下記を追加。

config.paths.add 'custom_exceptions', eager_load: true

これは4系までの書き方のよう。

# config.autoload_paths += %W(#{config.root}/custom_exceptions)

参考 Rails5: production環境でのAutoloadの廃止 - Qiita

4、 autoload_pathsに追加されているか確認するコマンド

$ bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'

実行。

$ bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
Running via Spring preloader in process 5421

/Users/takeyoshimasaru/workspace/bugtracker/app/channels
/Users/takeyoshimasaru/workspace/bugtracker/app/controllers
/Users/takeyoshimasaru/workspace/bugtracker/app/controllers/concerns
/Users/takeyoshimasaru/workspace/bugtracker/app/jobs
/Users/takeyoshimasaru/workspace/bugtracker/app/mailers
/Users/takeyoshimasaru/workspace/bugtracker/app/models
/Users/takeyoshimasaru/workspace/bugtracker/app/models/concerns
/Users/takeyoshimasaru/workspace/bugtracker/app/serializers
/Users/takeyoshimasaru/workspace/bugtracker/lib
/Users/takeyoshimasaru/workspace/bugtracker/custom_exceptions <<<-------これ!

正しく認識されています。

5、 rails consoleでdefined?メソッドを使って確認できる。

# まだCustomExceptions::HogeErrorは呼び出されていないので未定義
irb(main):003:0> defined?(CustomExceptions::HogeError)
=> nil

# 呼び出す
irb(main):004:0> CustomExceptions::HogeError
=> CustomExceptions::HogeError

# 呼び出されているので定義済であることが確認出来る
irb(main):005:0> defined?(CustomExceptions::HogeError)
=> "constant"
注意点

若干厄介なのは本番環境時においてはautoloadが無効化されておりeager load(rails起動時にまとめて読み込む機能)が有効で、開発環境では逆にautoloadが有効でeager loadが無効になっています。(デフォルトの設定の場合。参考: Rails アップグレードガイド | Rails ガイド) 故にautoloadとeager loadどちらでもクラスが読み込まれるようにしなければなりません