20201012_アウトプット(Rails勉強会復習)

アプトプット画像

学んだこと

  • エラーに向き合う

(1)新規投稿ページにアクセスできない

エラー画像1

3ステップ 詳細
現状把握 ●現状:新規投稿ボタンをクリックしたら、エラーが発生した
●ゴール:新規ツイートの投稿フォームが表示される
エラー文を解読 ●Tweetsコントローラーのnewアクションが動いたが、テンプレートが見つからない
仮説を立てる ●ビューファイルが表示されないため、ビューファイルが存在するか確認する
●今回は「new.html.erb」が対象

【結果】ファイル名のスペルミスだった。コントローラーのアクション名とビューファイルの名前は同じ。
【ポイント】No templateのエラーはビューファイルが存在しないことを意味する。




(2)新規投稿するとエラーが生じる

エラー画像2

3ステップ 詳細
現状把握 ●現状:ツイートを投稿したところ、Routing Errorが発生する
●ゴール:ツイートの投稿ができ、「投稿が完了しました」と表示される
エラー文を解読 ●HTTPメソッドPOST、URIパターン”/tweets”に一致するものがない
(ルーティングエラーの場合、rails routesの結果が表示されるためそれを活用する)
仮説を立てる ●ツイートを投稿した時に動くアクションがルーティングに定義されていない
●ツイートを投稿した時に動くアクションはcreateアクション
●routes.rbをみて設定を確認する

【結果】ルーティングファイルのresourcesにおける「create」アクションが抜けていた。
【ポイント】createアクションを追加することにより、7つのアクションが全て揃う。そのため、onlyを消して、「resources :tweets do」となる。

resources
7つのアクション
HTTPメソッド 機能
index GET 一覧表示
new GET 新規投稿ページへ遷移
create POST 登録(新規追加してDBへ保存)
edit GET 編集ページへ遷移
show GET 詳細表示
update PUT/PATCH 更新(更新してDBへ保存)
destroy DELETE 削除

補足:PUTは丸ごと置換する、PATCHは一部を変えたり付け足したりする。




(3)投稿した内容が表示されない

【エラー文:なし】

3ステップ 詳細
現状把握 ●現状:投稿した内容が表示されない。DBへも保存されていない。
●ゴール:投稿した内容がDBへ保存され、表示される。
エラー文を解読 ●なし
仮説を立てる MVCの流れに沿って一つずつ確認していく。

【結果】プライベートメソッドに定義していたpermitのkeyが「text」が「test」になっていた。よってデータベースに保存されていなかった。
【ポイント】

  • モデルはDB側なのでDBにうまく保存されていない場合にはモデルに原因があるとは考えにくい。

  • 情報が間違えている→コントローラーが原因。

  • そもそも情報がない→リクエストを送ったビュー側に問題あり。(binding.pryでparamsみてもスカスカな時)

  • エラー文がない時はMVCの流れに沿って仮設検証を実施する。

  • binding.pryを使うと中身をみることができる。

  • binding.pryの流れについて
    ①コントローラーの処理をとめたい直前にbinding.pryをいれる。
    ②ページで投稿してみる(画面固まる)
    ③ターミナルに行って送られた情報を確認する
    (コントローラーで設定しているパラムス名tweet_paramsと入力して中身確認)
    ④ターミナルでexitと押す。
    ⑤コントロール+cでサーバー停止。
    ⑥サーバー立ち上げ。
    binding.pryの記載消す。

  • 投稿したデータはparamasという箱(ハッシュ)に入る。

  • paramsの箱の中に:tweetの箱が入っている。:tweetの箱の中に:imagetextが入っている。(コントローラーに設定しているpermitにおいて、:imagetextが許可されたものか照合し、OKであればDBに保存される)

  • :text:imageは「キー」の役割を果たしている。こちらの「キー」をもとに、今回で言えば、ビューファイルのform_withから入力された内容を、保存されたDBへ「バリュー」をとりに行っている。




(4)投稿の詳細ページでアクセスできない

エラー画像4

3ステップ 詳細
現状把握 ●現状:「詳細」ボタンをクリックするとNoMethodErrorが発生する。
●ゴール:ツイートの詳細画面を見ることができる。
エラー文を解読 ●①「NoMethodError in TweetsController#show」
→Tweetsコントローラーのshowアクションに定義されていないメソッドがある。
●②「Did you mean? comments」
→'comment'は定義されていない。'comments'と書きたかったのでは?
仮説を立てる ●エラー文で言われいている通り、コントローラーのshowアクションにある'comment'を'comments'に直してみる。
  • なぜそもそも複数形にしないといけなかったの?
    →モデルに書いてあるアソシエーションが関係している
    (今回は一つのユーザーに対して複数のコメントが紐づく「1対多」の関係だった)

  • Did you mean? はヒントなので参考にしてみる

  • アソシエーションはモデルに記載する




(5)マイページにアクセスできない

エラー画像5

3ステップ 詳細
現状把握 ●現状:マイページにアクセスするとNoMethodErrorが発生する
●ゴール:マイページをみることができる。
エラー文を解読 ●①「NoMethodError in UsersController#show」
●Usersコントローラーのshowアクションに定義されていないメソッドがある。
●'tweets'は定義されていない。
仮説を立てる ●このtweetsはuserが持っているtweetsを意味する。
●userは複数のツイートを持つ
●Useモデルのアソシエーションを確認する。
  • アソシエーションのスペルミスだった。(モデル)

  • did you mean?が変な綴りの時は、それに関連している他の部分がおかしい。(今回で言えば、「コントローラーの綴り誤っている?」とエラーが出たが、紐解いてみると「モデル」の誤りだった。)




(6)検索するとエラーが生じる

エラー画像6

3ステップ 詳細
現状把握 ●現状:検索するとRoutingErrorが発生する
●ゴール:検索でき、検索結果が表示される。
エラー文を解読 ●Routing Error / No route matches [POST]"/tweets/search"
●ルーティングエラーが発生している。
●POSTとルーティングが合わない。
仮説を立てる ●リクエストがHTTPメソッドPOSTで飛んでいる。
●ルーティングのファイルをチェックする。
form_withがあるapp>views>tweets>index.html.erb
  • ついHTPPメソッドが違うと、ルーティングかな?と思ったが、そもそもユーザーに入力してもらったものを、ビューファイルで受け取り、コントローラーへ渡しているform_withの指定HTTPメソッド誤りであった。

  • エラーとは関係ないが、ルーティングで「7つのアクション」以外を定義する場合にはcollectionを使用して設定する(今回はsearchアクション)

HTTPメソッド 役割
GET 情報を取得する
POST 情報を投稿する
PUT 情報の全体を修正する
PATCH 情報を部分修正する
DELETE 情報を削除する




感想

  • いつも夕食後、眠くなってしまう。休み明けで朝1時間のみの勉強だったこともあり、夜も勉強もう少しやりたかった。結果、筋トレをしたら目が覚めて集中できた。