LoginSignup
4

More than 3 years have passed since last update.

Railsアプリケーションデプロイ後にlib配下が読み込めない時の対処法

Last updated at Posted at 2019-01-17

環境

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)
は削除してしまって大丈夫です。

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
4