111
65

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 5 years have passed since last update.

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

Last updated at Posted at 2017-01-12

環境

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

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

111
65
3

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
111
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?