Herokuにデプロイした時のエラーについての備忘録


Herokuにデプロイした際に出たエラーとその解決策について復習も兼ねて解説したいと思います。

まずgit push heroku masterをした後にheroku run rails db:migrateをしてサイトにアクセスしたら以下のようなよく見るエラー文が表示されました。

そこでheroku logs --tail --app 【アプリケーション名】でログを確認してみました。

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  relation "posts" does not exist

確認した所、上記のエラーメッセージが見つかりましたので恐らくここが原因を示していると判断しました。

そこで調べてみたところどうやらHerokuではローカルではmigrationが普通に出来ていたとしても、Heroku上ではmigration fileは日付順にmigrateされるとのことでした。

ここでローカルのデータベースを確認してみます。
rails db:migrate:statusを実行

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210118033907  Create posts
   up     20210118044855  Devise create users

上記のようになっていたのでマイグレーションを実行すると、先にpostsテーブルが作られるがリレーションをしているusersテーブルがこの時点では作成されていないためエラーが出ていたみたいでした。
したがってusersテーブルを先に作られるようにする必要があります。
※注釈)リレーションをしているとは「userとpostモデルで1対多などを指定しているの意味」

なので、rails db:dropをした後にマイグレーションファイルのdevise_create_usersの日付(= Migration ID:上記の画像の箇所)をpostsより早い日付になるように手動で修正します。
=>「ローカルのマイグレーションファイル名の日付箇所を修正する」
あとはrails db:createしてrails db:migrateします。

※注意)rails db:dropしたらデータベースの中身は消えますので注意してください。

修正が完了したらもう一度ローカルのデータベースを確認します。
rails db:migrate:statusを実行

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210117044855  Devise create users
   up     20210118033907  Create posts

usersテーブルの日付が先になったのでこれでOKです。

あとはファイル編集の内容をローカルリポジトリのmain(master)ブランチに反映させます。

そして再度git push heroku masterを実行してheroku run rails db:migrateを実行したところ、今度はエラーが出ないで無事にデータベースが作成されました!

これで無事にサイトが表示されました🎉
安心しました。

補足

補足でもう1つのエラーについても説明します。

サイトが無事に表示された後に自分の場合はゲストログイン機能があるのでボタンを押して実行した所、下記のようなエラーが出ました。

ようやくサイトが表示されてホッとしていた所であまり見たことのないエラーが出たのでビビリましたが、調べてみたところCookieを削除すれば直るとの情報を見つけました。
(調べたところ、どうやらRailsのCSRF保護によって発生したエラーらしいので、エラーというよりは仕様みたいです)

そこでChromeの設定からHerokuの自分のアプリケーション名のCookieを削除したら無事に直りました!
(Cookieの削除は各自のお使いのブラウザで行ってください)

良かったです🙌

参考サイト