Herokuデプロイ後にNoMethodErrorの沼にハマる
満を持して、RailsのアプリをHerokuにデプロイ。
「いやあああ、これでRail開発もひと段落やわああああああ」
と思い、おしぼりを目に当てようとすると、エラー発生!
We’re sorry, but something went wrong.
If you are the application owner check the logs for more information.
ローカル環境で問題なかったのに、なぜにデプロイ後に?
$ heroku logs -t
でエラー原因を探ると、次の手がかりを炙り出せました。
- NoMethodError (undefined method password_digest=’ for #<User:0x0000563bc9b410d0>
- app/controllers/users_controller.rb:50:in create’
エラーが出た経緯を書いておきましょう。
git add . git commit -m "first"
でコミットし、
git push heroku master
でHerokuにデプロイ。
さらにそのあと、マイグレーションのコマンド
heroku run rails db:migrate
を発動させた後でした。
アプリのトップページに飛んだら、サイトへアクセスできました。
ただ、調子に乗って、会員登録(ユーザーを作成)しようと「作成ボタン」を押した瞬間、
「Sorry」と出てしまったのです。
助けを求めてググって言いましたが、どれもこれも参考になりません。
マイグレーション忘れとか、$ heroku restartでリセットするとか、そういうものばっかり。
どれを試してもNoMethodErrorエラーは解決しません。
あまりの現実の厳しさに、Railsアプリ開発を諦めようと思ったこともありました。
データベースをチェックしたら、突破口を開けた
今にも腐りそうでしたが、
「いや、ちょっと待って。データベースはちゃんと反映されているのか?」
とHerokuのDataclipsでデータベースをチェック。

すると、「あるはずのテーブル」が1mmも作られていないと判明したのです!
半分ぐらい作られて終わっていたのですね。
エラーの原因となっていた「usersテーブル」にあるはずの「password_digestカラム」はありません。
別に作った「likesテーブル」はそもそも存在していないようでした。
これらのことから、
マイグレーションが完璧にできておらず、データベースが完全に作られなかった
という仮説が浮かび上がってきました。
とどのつまり、usersテーブルにあるはずのpassword_digestカラムがなかったので、ユーザーを作成すると、
password_digestカラムに当てはまる値ないよ?
というエラーだったのはないか、と。
「こ、これだ」
試しにもう一度、
$ heroku run rails db:migrate
でマイグレーションすると、次のエラーが出ていると気づきました。
I, [2020-05-21T13:32:01.670278 #4] INFO — : Migrating to Yokeidelete (20200316130257)
D, [2020-05-21T13:32:01.672430 #4] DEBUG — : (0.5ms) BEGIN
== 20200316130257 Yokeidelete: migrating ======================================
— remove_column(:users, :age, :integer)
D, [2020-05-21T13:32:01.674863 #4] DEBUG — : (2.1ms) ALTER TABLE “users” DROP COLUMN “age”
D, [2020-05-21T13:32:01.675659 #4] DEBUG — : (0.6ms) ROLLBACK
D, [2020-05-21T13:32:01.676657 #4] DEBUG — : (0.7ms) SELECT pg_advisory_unlock(5566982743631305500)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:PG::UndefinedColumn: ERROR: column “age” of relation “users” does not exist
: ALTER TABLE “users” DROP COLUMN “age”
てっきりマイグレーションは成功と思っていましたが、
途中でマイグレーションはストップしていたのです。
rails abort!
って出ちゃっていますから。
読んでみると
20200316130257 Yokeidelete
というマイグレーションファイルでエラーを起こしていて、
remove_column(:users, :age, :integer)
が実行できない、と。
しかも、エラー原因までわかりやすく書いてくれていて
column “age” of relation “users” does not exist
つまり、
usersテーブルにageカラムないぞ?
と言っています。
remove_column(:users, :age, :integer)
でageカラム削除しようとしているけど、そもそもusersテーブルにないやん?
となっているのですね。
これはやべえミスです。
このクソみたいなマイグレーションファイルは、何を隠そう、ぼく自身が生み出したものです。
Railsのカラム追加・削除方法を覚えるため、練習で作ったマイグレーションファイルの一部ではありませんか。

「お前達が原因だったんかいw」
その他にも練習で作ったままにしていたマイグレーションファイルが「6~7つ」ありました。
ってことで、練習用マイグレーションファイルをすべて削除。
その後に
$ heroku run rails db:migrate
を実行すると、エラーなしでマイグレーションできましたね。
その上でHerokuアプリにアクセスすると・・・・・・
エラー消失!!
アプリとして機能し、ユーザーも作れるではありませんか。
やりました、やりました。
やっと「エラーの沼」から脱出しましたよ。
いやあ、間一髪。
エラーを解決できずにアプリを作り直すところでした。
NoMethodErrorに苦しむ方は、マイグレーションできなかった可能性もあります。
そこらへんをチェックしましょう。
それでは!
Lin