1. Qiita
  2. 投稿
  3. Ruby

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

  • 3
    いいね
  • 0
    コメント
に投稿

環境

Ruby 2.3.1
Rails 5.0.0

Rails5からデフォルトでproduciton環境にてautoloadが無効になりました→Rails アップグレードガイド | Rails ガイド

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起動時にまとめて読み込む機能)が有効で、開発環境では逆にautloadが有効でeager loadが無効になっています。(デフォルトの設定の場合)

故に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

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

余談

この記事が「rails lib NameError」とかで引っかかればいいな〜googleさん!