Edited at

Progateで作ったアプリをHerokuでデプロイしてたらテスト環境では動いたのにUnknownAttributeErrorをもらったから解決までの奮闘


デプロイはエラーとともに

【Ruby on Rails】スクールを超えるポートフォリオを実装する3STEP【実例あり】」を参考にして、progateで作ったアプリをHerokuでデプロイしていたら、エラーをいただきました。せっかくなので、備忘録がてら解決までにやったことを残しておこうと思います。何かしらの参考になれば幸いです。


環境

ruby 2.6.1

Rails 5.2.3
MacOS Mojave 10.14.6


見慣れぬ文字列

plogateのRailsアプリをローカル環境で作ってHerokuでデプロイしたら「UnknownAttributeError 'image_name' for User」。意味合いは「"image_name"カラムが"User"の中にないよ」ということらしい。そんなことは…ない…はず…?

でもエラーはエラーなので、「HerokuのDBにローカルPCからアクセスしたいんだけど...」の記事を参考にしてコマンドラインからデータベースのカラムを確認しました。


データベースの構成を確認

$ heroku pg:psql -c "-d"


Schema | Name | Type | Owner
--------+----------------------+----------+----------------
public | ar_internal_metadata | table | hoge
public | posts | table | hoge
public | posts_id_seq | sequence | hoge
public | schema_migrations | table | hoge
public | users | table | hoge
public | users_id_seq | sequence | hoge
(6 rows)

users(User)は存在してるので中身を確認…


Userの中を確認

$ heroku pg:psql -s "select * from users"

--> Connecting to ~~

id | name | email | created_at | updated_at
----+------+--------+----------------------------+----------------------------
1 | aaa | foo.jp | 2019-09-03 01:31:55.168638 | 2019-09-03 01:31:55.168638

無いですね😇

パスワードとか、アイコン画像とかを保存しておくためのカラムがありません。確かに作ったはずなのに!

どうやら、データベースに変更があるデプロイをした時に、Heroku側のデータベースの更新を忘れていたようです!


更新、そして___

というわけで"heroku run rails migrate"を打ち込んで更新します…


更新

$ heroku run rails db:migrate

Running rails db:migrate on ⬢ hogehogeapp... up, run.7490 (Free)
~~

Runninng〜の後にズラズラーっと更新された内容が並んでいきます。

完了したら確認します。


再確認

$ heroku pg:psql -c "select * from users;"

--> Connecting to ~~
id | name | email | created_at | updated_at | image_name | password_digest
----+------+---------+----------------------------+----------------------------+-------------------------------------
1 | aaa | foo.jp | 2019-09-08 20:14:50 | 2019-09-08 20:14:50. | |

image_nameや、password_digestのカラムができていることが確認できます!!

しかしここで一つ問題があります...それは...


空のレコード

"password_digest","image_name"に空のレコードが入ってしまっていることです。これは良からぬエラーの原因になりますので解消しておかねば😤

空白のカラムに対しては、レコードを追加するか、丸々削除するかが選べます…。今回は練習用のアプリでユーザー情報に全く意味はないので削除していきます。今回は"heroku run rails console"でHerokuの中のrails consoleを立ち上げ、データベースを変更していきます!


consoleの立ち上げ

$ heroku run rails console

Running rails console on

〜〜〜〜〜
irb(main):001:0>


"irb(main):001:0>"←こんなのが出たら立ち上がってますので、空の情報を持ってるユーザーを削除します。

りょうたくさんのわかりやすいまとめを参考にしました!

参考:削除系メソッド(delete, delete_all, destroy, destroy_all)について


削除

irb(main):001:0> User.where(image_name: nil).destroy_all


これで全部削除できているはずですので、再々確認します


再々確認

$ heroku pg:psql -c "select * from users;"

--> Connecting to #"appに紐づくDB"
id | name | email | created_at | updated_at | image_name | password_digest
----+------+---------+----------------------------+----------------------------+------------------+--------------------------------------------------------------
(0 rows)

0rows(データ無いよ!の意)が出たので成功です!

(有料区間なので表示はできませんが、)デプロイしたアプリのエラーも消えてました!!🤗<バンザイ!!


まとめ

今回のエラーで私が得るべき教訓は、データベースを更新したら中に入ってるデータも確認しておくことです🙂

次は自作で簡単なアプリを作るはずなので、そこでの奮闘も記事にできたらと思います。

書いた方がいいことや概念の間違いなどがあればお手数ですがコメントにてご教授ください!!

では!!


参照記事

HerokuのDBにローカルPCからアクセスしたいんだけど...

【Ruby on Rails】スクールを超えるポートフォリオを実装する3STEP【実例あり】

削除系メソッド(delete, delete_all, destroy, destroy_all)について