Edited at

Rails5のproduction環境でlib/配下のクラス読込みがNameErrorになるのはautoloadが無効化されたからだった

More than 1 year has passed since last update.


環境

Ruby 2.3.1

Rails 5.0.0


lib/配下の独自のクラスを呼んでもNameErrorに...

Railsではユーティリティ等の独自に定義したクラスを


lib/utils/hoge_util.rb

class HogeUtil

end

と作成し、config/application.rbにて


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/application.rb

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

config.eager_load_paths += %W(#{Rails.root}/lib)

なのですが毎回2つ定義するのもなんとも煩わしい

少し調べた所 Rails5: production環境でのAutoloadの廃止 - Qiita にて


config/application.rb

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


なんて書き方があり、スッキリしてて良さそうです。