環境
Ruby 2.3.1
Rails 5.0.0
lib/配下の独自のクラスを呼んでもNameErrorに...
Railsではユーティリティ等の独自に定義したクラスを
class HogeUtil
end
と作成し、config/application.rb
にて
config.autoload_paths += %W(#{Rails.root}/lib)
なんてよくやったりしますが、いざこれを本番で動かしてみると
NameError: uninitialized constant HogeUtil
を食らったので
autoload周りの設定が違うのかな〜と思い色々ググるも出てくるのは「autoload_paths
に/lib
を読ませればok」といった記事ばかり...
それもそのはず、出てくる記事の情報はRails4以前のものばかりで、今回のエラーが出るのはRails5から。
原因に辿り着くまでに時間がかかってしまった...
解決策
若干厄介なのは本番環境時においてはautoloadが無効化されておりeager load(rails起動時にまとめて読み込む機能)が有効で、開発環境では逆にautoloadが有効でeager loadが無効になっています。(デフォルトの設定の場合。参考: Rails アップグレードガイド | Rails ガイド)
故にautoloadとeager loadどちらでもクラスが読み込まれるようにしなければなりませんが、素直にやると
config.autoload_paths += %W(#{Rails.root}/lib)
config.eager_load_paths += %W(#{Rails.root}/lib)
なのですが毎回2つ定義するのもなんとも煩わしい
少し調べた所 Rails5: production環境でのAutoloadの廃止 - Qiita にて
config.paths.add 'lib', eager_load: true
なんて書き方があり、スッキリしてて良さそうです。