プログラミング初学者です。
認識の誤り、そもそも間違ってるで?というところはご教授いただけると嬉しいです。
・エラー発生の要因 ・要因発見までの方法 ・なぜその要因がエラーになるのか
について記述しています。
#herokuデプロイ後に特定ページで『We're sorry, but something went wrong.If you are the application owner check the logs for more informatio』が立ちはだかった件
ユーザー登録後に遷移するページでエラーがでました。
ローカル開発環境(cloud9)では問題なく表示できていたのですが・・
エラー発生以降、ググって試して、ググって試してを繰り返し、1日半かけて無事解決。
さて、何が原因だったのか
##結論
該当コントローラーのアクションの記述が間違っていました。
@user = User.find_by(params[:id])
#間違い
@user = User.find(params[:id])
#こっちが正しい
##学び
この問題の重要なところは、メソッドが違っていたという答えではなく、エラーを解決するまでの方法です。
釣った魚より、釣る方法のほうが再現性は高い。
独学でプログラミング学習を始めて、1日以上悩んだのは今回が初めて。
エラーへの向き合い方をいい加減、考えないといけません。
今回のエラーから、herokuエラーが発生した時の対応方法をまとめておきます。
##We're sorry, but something went wrong
このエラーは今回のようにメソッドミス、syntax_error、migrationファイルの反映がされていないなど色んな原因で発生するようです。
私もそうでしたが、ほとんどが
①DBの問題
②コードの問題
で解決しているパターンが多いようです。
①に関してはURLのid番号が登録のたびに増えているため、登録はできていそう
②なら多数あるディレクトリからエラーを見つけないといけません。
心が折れました。
どこに原因があるのかわからん。
herokuエラー 原因の調べ方
方法は色々ありますが、
ターミナルで
heroku logs -tail
(heroku logs -t でも可)
これでエラーの詳細を確認しました。
ただ、どこにエラーが書いているのか初学者には分からない。
そのためはじめはさらっと流し見してました。
今回これだけ時間がかかったのは__このログとちゃんと向き合わなかった事。__
Qiita、teratail、ブログをみても「ログで確認する」って書いてあるのにね。
大事な事なのでもう一度言う!!
エラーメッセージ、ログとちゃんと向き合う!!
じっくり落ち着いて見てみると
Completed 500 Internal Server Error in 6ms (ActiveRecord: 1.9ms | Allocations: 568)
以外にも、もう一つエラーがあった。
ActiveRecord::StatementInvalid (PG::DatatypeMismatch: ERROR: argument of WHERE must be type boolean, not type integer)
めちゃくちゃActiveRecordでエラーって書いてますね。
エラーの内容は
「whereの引数は整数じゃなくて、真偽値じゃないとだめだよ」
とのこと
データベースからの検索でミスがあるのか?と調べ、冒頭のコードミス発見に至る。
#「find」「find_by」の違い
参考
Railsチュートリアル
https://qiita.com/nakayuu07/items/3d5e2f8784b6f18186f2
https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3
findメソッド
まずfindは主キー(railsでは自動的にid)で検索できる。
params[:id]では文字列としての数字(例:'1')が返ってきますが、findメソッドが自動的に整数に変換してくれます。
そのため
User.find(params[:id])
#と
User.find(整数)
等価です。
では次にfind_byは?
主キー以外でも検索できるメソッド
構文としては
User.find_by(id: 1)
User.find_by(name: "em")
つまりエラー発生時のコードではどの属性を検索しているかわからなかった。
User.find_by(1)
になっていたわけで、当然エラーになる。
#未解決:User.find_by(1)がなぜローカル開発環境で動作していたか
統合テストで該当ページへのルーティング、アクション、html.erbの表示が正しく動作しているかをチェックするようにしていて、findでもfind_byでもGreenで返ってくる。
今のところ理由は分からない。
分かったら追記します。
#学びまとめ
・エラーメッセージ、ログとしっかり向き合う
・herokuでのエラーはheroku logs --t
で見れる
・「find」、「find_by」の違い