ローカルで動いたDocker+Railsアプリを本番環境で動かそうとしたところ、Webコンテナ(nginx)は立ち上がったが、appコンテナ(puma)のステータスがexitedになる状況が起こった。
docker logs で確認したところ、以下のようなエラー分が検出された。
log
Zeitwerk::NameError: expected file /app_name/app/controllers/function.rb to define constant ...
今回の場合、コントローラーに定義する関数が長くなり可読性を損なうため、ファイルを別のファイル(function.rb)で定義して、includeでコントローラに取り込んでいる。そのため、controllers配下に関数を定義するファイルがなく、Zeitwerk(Rails6.01から標準となっている定数の自動読み込み機能)がそれを検知してエラーを吐く。
対処法
config/application.rbにconfig.autoloader = :classic
を追記
config/application.rb
module App
class Application < Rails::Application
config.autoloader = :classic
end
end
Zeitwerkモードを利用しないように設定を変更している。これで一応動くようになるが、そもそも関数をどこに、どのように定義すべきなのか、その辺の課題は依然残る。