20201012_アウトプット(Rails勉強会復習)
学んだこと
- エラーに向き合う
(1)新規投稿ページにアクセスできない
3ステップ | 詳細 |
---|---|
現状把握 | ●現状:新規投稿ボタンをクリックしたら、エラーが発生した ●ゴール:新規ツイートの投稿フォームが表示される |
エラー文を解読 | ●Tweetsコントローラーのnewアクションが動いたが、テンプレートが見つからない |
仮説を立てる | ●ビューファイルが表示されないため、ビューファイルが存在するか確認する ●今回は「new.html.erb」が対象 |
【結果】ファイル名のスペルミスだった。コントローラーのアクション名とビューファイルの名前は同じ。
【ポイント】No templateのエラーはビューファイルが存在しないことを意味する。
(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
の箱の中に:image
とtext
が入っている。(コントローラーに設定しているpermit
において、:image
とtext
が許可されたものか照合し、OKであればDBに保存される):text
や:image
は「キー」の役割を果たしている。こちらの「キー」をもとに、今回で言えば、ビューファイルのform_with
から入力された内容を、保存されたDBへ「バリュー」をとりに行っている。
(4)投稿の詳細ページでアクセスできない
3ステップ | 詳細 |
---|---|
現状把握 | ●現状:「詳細」ボタンをクリックするとNoMethodErrorが発生する。 ●ゴール:ツイートの詳細画面を見ることができる。 |
エラー文を解読 | ●①「NoMethodError in TweetsController#show」 →Tweetsコントローラーのshowアクションに定義されていないメソッドがある。 ●②「Did you mean? comments」 →'comment'は定義されていない。'comments'と書きたかったのでは? |
仮説を立てる | ●エラー文で言われいている通り、コントローラーのshowアクションにある'comment'を'comments'に直してみる。 |
なぜそもそも複数形にしないといけなかったの?
→モデルに書いてあるアソシエーションが関係している
(今回は一つのユーザーに対して複数のコメントが紐づく「1対多」の関係だった)Did you mean? はヒントなので参考にしてみる
アソシエーションはモデルに記載する
(5)マイページにアクセスできない
3ステップ | 詳細 |
---|---|
現状把握 | ●現状:マイページにアクセスするとNoMethodErrorが発生する ●ゴール:マイページをみることができる。 |
エラー文を解読 | ●①「NoMethodError in UsersController#show」 ●Usersコントローラーのshowアクションに定義されていないメソッドがある。 ●'tweets'は定義されていない。 |
仮説を立てる | ●このtweetsはuserが持っているtweetsを意味する。 ●userは複数のツイートを持つ ●Useモデルのアソシエーションを確認する。 |
アソシエーションのスペルミスだった。(モデル)
did you mean?が変な綴りの時は、それに関連している他の部分がおかしい。(今回で言えば、「コントローラーの綴り誤っている?」とエラーが出たが、紐解いてみると「モデル」の誤りだった。)
(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時間のみの勉強だったこともあり、夜も勉強もう少しやりたかった。結果、筋トレをしたら目が覚めて集中できた。