uninitialized constant というエラー文

Railsのrunnerでバッチ処理を作成していました。
私はlib以下にバッチ用のディレクトリを作成して、そこにバッチファイルを作成しています。

例えば、今回hogeディレクトリにrunner_test.rbを作成したとします。

# lib/hoge/runner_test.rb
class Hoge::RunnerTest
  def self.execute
    p 'hello'
  end
end

これを実行するときには、下記になります。

$ rails runner Hoge::RunnerTest.execute

さて、これを実行したときに処理が失敗しました。
ふむふむ、エラー文を見ると、 uninitialized constant Hoge と出力されています。

このときはまだ甘く考えていました。

Rails 5のドキュメントを今更確認する

  • 開発環境で確認する。 => 問題なく処理される
  • 本番環境のファイルを確認 => 存在していた。念のため再デプロイ => uninitialized constant

lib以下のファイルをロードするパスに追加する際には、configに下記の一文を追加しています。

# config/application.rb
config.autoload_paths += Dir["#{config.root}/lib"]

もしかして、こいつが読み込まれていないのでは?と考え、調査開始。
すると、Railsのドキュメントに下記の通り記載がありました。。。
Autoloading is Disabled After Booting in the Production Environment

簡単に意訳

  • デフォルトでは本番環境でAutoloadされないよ。
  • Eager loadingなら読み込むよ。
  • Production環境でAutoloadしたければ、下記の一文を追加してね。
# config/application.rb
Rails.application.config.enable_dependency_loading to true

この一文を追記して試したところ、解決してしまいました。

まとめ

  • Rails 5ではconfigで追記したパスをproduction環境では自動で読み込まない
  • 読み込ませたいなら、configに追記する
  • 推奨方法は他にもあるため、そちらも検討する
Shere
  • はてなブログ
  • Twitter
  • Facebook
Rails 5ではproduction環境でAutoloadしない?

Writer

  • Name

    Naoki

  • Position

    RubyやPHPが書きたい雑用

  • Profile

    最近、(自称)PHPerから(自称)Rubyistに移行しようと考えている雑用です。Rubyのオブジェクト 指向はすごい分かりやすいので好きになりました。また、メソッド名に?が使えるのも良いですよね!