この記事はプログラミング学習者がアプリ開発中に躓いた内容を備忘録として記事におこしたものです。内容に不備などあればご指摘頂けると助かります。
開発環境で機能を実装し終わって、いざHeroku(本番環境)へPushした時にエラーが発生しました。
NoMethodError in CommentsController#create
undefined method'parent_id=' for #<保存しようとしたデータ>
このエラーが開発環境で出ていたら、空(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カラムの有無を確認したところ、見つけることができました。
`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
の中身
parent_id
カラムの確認ができました。
キャッシュの問題を疑う
次にHeroku(本番環境)で、モデルやスキーマのキャッシュが残っていることが原因で、カラムが認識されていない可能性を疑いました。
Herokuのキャッシュをクリアして再デプロイを試みます。
heroku run rake tmp:chache:clear
キャッシュをクリア
heroku restart
再起動
これにより、Herokuのキャッシュがクリアされ、最新のスキーマが適用されるはずです。
私の場合はこの対策をすることで冒頭のエラーは解消され、アプリが正しく動くようになりました。
以上、最後まで読んで頂きありがとうございます。
読まれた方のお役に少しでも立てたら幸いです。
-今回参考にした記事一覧-
HerokuのDBを操作する方法