コメント送信時に空のコメントが出来てしまうエラー😒
まず結論
<%= form_with(model: [@post, @post.comments.build], local: true) do |form| %>
の
@post.comments.build
がエラーの原因で、こいつのせいで空のコメントができてしまっている。。。
(でもこれは正しいやり方。後述)
対処方法
postコントローラーに追記
@comments = Comment.where(post_id: @post.id)
ここでいうwhereはdbのコメントテーブルの中のpost_id: @post.id postに紐づくコメントアソシエーション関係なく取ってくる。(このやり方は結構特殊らしい)
まず、、form_with に対する理解が浅いのでここから教えてもらいました。。優しい。。😇
form_with model: @post は詳しく見るとこうなってる
@post
id: nil
title: nil
subtext: nil
created_at: nil
よくコントローラーに書くこれ
@comment = Comment.new
@post = Post.new
のように空の箱を用意してるよね。それをform_withに紐付けて表示して書き込めるようにする
その後にユーザーが書き込むと
@post
id: nil
title: 私もおすすめ
subtext: ケーキ美味しかった
created_at: nil
という状態になる。
その後コントローラーに送られて保存されidやcreated_atも保存される。
で、今回の場合、というかほとんどの場合コメントって何かに紐付いてる。
今回もpostに紐付いている、アソシエーションしているため、post情報とコメントの情報送る必要ある
そういう時に使うのが今回のエラーの原因の< @post.comments.build >
これは、@postに紐付いた空のカラムが作られる、
細かくいうとpost_id: だけ先に書かれてるからのコメントカラムができる。
id:nil
comment: nil
post_id: 20
created_at: nil
こんな感じ。
だから@post.comments.build 書くのは正しいんやけど今回はなぜかここで出来た空の投稿が
each文で取り出されてからコメントができてる状態。。。
だったそうで、、なんで?????😇(珍しいエラーらしい。色々自分でいじってたから原因わからない。。。)
なので今回はメンターさんが苦肉の策?で下記にコードを変えました。そしたら解決。。。
<% @post.comments.each do |comment| %>
だったのを@comments = Comment.where(post_id: @post.id)で再定義して
<% @comments.each do |comment| %>
数時間格闘して自分でも訳わからんくなって質問したためメンターさんにも可能性と自分の考えは伝えたけど、うまく説明できず、、、なぜ起きたかは不明のままです🥲
まあ、フォームのことは復習できたし、対処法も知れたから、、同じ過ちをしないように、もし起きた時に
次は自分で解決できるようにメモ。。。
やっぱ19時以降しか質問できひんのキツイ笑
がんばろーっと。
Discussion