1
1

Heroku(本番環境)のみエラー発生、開発環境は問題無し

Posted at

この記事はプログラミング学習者がアプリ開発中に躓いた内容を備忘録として記事におこしたものです。内容に不備などあればご指摘頂けると助かります。

開発環境で機能を実装し終わって、いざHeroku(本番環境)へPushした時にエラーが発生しました。

NoMethodError in CommentsController#create
undefined method'parent_id=' for #<保存しようとしたデータ>

Heroku デプロイ後のエラー画面.png

このエラーが開発環境で出ていたら、空(Nil)のデータをcreate → save しようとしているのかな、ということでbinding.pry等でデバッグして変数内の値をチェックしてみよう等といった動きを取ろうと考えるのですが、既に開発環境では動作の問題が無いことを確認できていました。

マイグレーションが正しく動作してparent_idが追加されているか

まず、エラーメッセージでundefined method 'parent_id='と表示されていたので、parent_idがDB上に正しく反映されているかを確認することにしました。というのもparent_idは今回Pushした機能で初めてDBに追加したカラムだったからです。
それとparent_id==が末尾に付いているのが不自然だな、と初見での気付きでした。

コマンドラインから下記のコマンドを実行することでHeroku内のDBを操作できます。
heroku pg:psql -a アプリ名 ※アプリ名はHerokuのサイトから取得
データベースに接続後はSQL操作をできるようになります。
select * from users;など
テーブル一覧の表示は\dt
操作を終了する時はquitでローカルのコマンドラインに戻ります。

実際にparent_idカラムの有無を確認したところ、見つけることができました。スクリーンショット 2024-09-12 6.25.48.png

`parent_id'カラムが認識されているかどうかを確認

parent_idは確認できましたが、Herokuのデータベースが最新のスキーマに追従していない可能性があります。heroku run rails db:migrateを実行してもデータベースが適切に同期していないことがあるため、データベースの状態を確認することにしました。
heroku run rails db:schema:dump
上記のコマンドを実行することで、Herokuのデータベーススキーマがローカルのdb/schema.rbに保存されます。その中のテーブル内でparent_idが正しく追加されているかを確認します。
※データベーススキーマ:データベースの設計図のようなもの

また、コマンドを実行するとその時点で記載されているローカルのデータベーススキーマは上書きされて消えてしまいます(再取得は可能)。
消えたら困るという方は事前にバックアップを取りましょう。
ローカルでのスキーマ再生成はrails db:migrateで可能です。

以下はdb/schema.rbの中身
スクリーンショット 2024-09-12 6.44.20.png
parent_idカラムの確認ができました。

キャッシュの問題を疑う

次にHeroku(本番環境)で、モデルやスキーマのキャッシュが残っていることが原因で、カラムが認識されていない可能性を疑いました。

Herokuのキャッシュをクリアして再デプロイを試みます。

heroku run rake tmp:chache:clear キャッシュをクリア
heroku restart 再起動

これにより、Herokuのキャッシュがクリアされ、最新のスキーマが適用されるはずです。

私の場合はこの対策をすることで冒頭のエラーは解消され、アプリが正しく動くようになりました。

以上、最後まで読んで頂きありがとうございます。

読まれた方のお役に少しでも立てたら幸いです。

-今回参考にした記事一覧-
HerokuのDBを操作する方法

1
1
0

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
1
1