環境
Ruby 2.4.1
Rails 5.2.2
Herokuにデプロイ後、lib配下のクラスなどが読み込めなくなる。
Railsでは、アプリケーション全体で共有する自作クラスなどを使用する際にはlibディレクトリにクラスを作成します。
例: lib/utilities.rbを作成
utilities.rb
class Utilities
def search
・・・
end
def lookup
・・・
end
end
このクラスをコントローラなどから呼び出すためには、自動的にlib配下を読み込む設定をconfig/application.rbに以下をするはずです。
application.rb
・・・
module SampleApp
class Application < Rails::Application
・・・
config.autoload_paths += %W(#{config.root}/lib)
・・・
end
end
ところが、本番環境(今回の場合はHeroku)にデプロイすると・・・
NameError: uninitialized constant SampleApp
というエラーが発生します。
SampleAppというクラスが読み込めないぞということです。
解決策
Railsが5.0にアップグレードされた際に、production環境では自動読み込みが無効化されるようになったみたいです。
参考元:Railsアップグレードガイド
要するに、production環境では自動読み込み(autoload)ではなく一括読み込み(eager_load)になるので、以下のようにlib配下もeager_loadされるように設定すれば解決します。
application.rb
・・・
module SampleApp
class Application < Rails::Application
・・・
config.paths.add 'lib', eager_load: true
・・・
end
end
ちなみに上の記述だと、development環境ではAutoloadされ、production環境ではEagerLoadされます。
よって、
config.autoload_paths += %W(#{config.root}/lib)
は削除してしまって大丈夫です。