32日目終了。今日困ったエラー解説します。渾身です。
↓今日やったこと
・form_withヘルパーの仕様について調査
・個人アプリ コメント画面ビュー作成、質問投稿→表示まで
エクストリーム!プログラミング! form_withヘルパーへ〜〜〜ん!!\( ̄▽ ̄)/
はい!始まりましたけども〜
まずは、form_withの仕様について確認していきます。
<%= form_with(model: user, local: true) do |form| %> ・・・ <% end %>
✅model: ~ で生成するフォームがどのモデルに基づいて作られるかを示します。
✅local: true でsubmitによるデータ送信にAjaxを使わないことを示します。この記述がないとAjaxを使うということになります。
✅class: ~ でクラス名を付与できます。 ↑()で囲まれていますが不要です。半角スペースでも問題ないです。
✅do |form| でformという変数を入れてendまでにある処理を回します。 do |f| という記述もあり、個人的にこっちの方が好きです。
✅form_with 〜 end までの間には、例として、form.text_field :text のような感じで入ります。
text_fieldはテキスト1行の入力欄(他にも種類はたくさんありますが割愛)。:text は保存したいテーブルのカラム名です。
これで大体の仕様はOKですね〜。
次は実際にどんなエラーに困ったか解説します!
こんなエラー画面でした。↓
ParameterMissing つまりパラメーターがないよ〜と言われています。
でもちょっと待ってください。画像の一番下にパラメーター入ってますよね?
でもこれは違うんです。求めるパラメーターではないのです。
params.require(:post).permit(:text) の意味は、キーがpostでtextカラムのデータの送信を許可するからその値をくれと言っています。(通称:ストロングパラメーター)
今送られているデータは、{“text” => “ああああああああ”} です。キーがtextで、あああああああがバリュー(値)です。
欲しいのは、{ “post” => { “text” => “ああああああああ”}}です。
なのでpostに紐づいているデータがないのでParameterMissingになっていました。
それは分かったけど、じゃあどうすればいいんだ!? これを解決するのに時間がかかりました。まず、posts_controllerとビューに記述したform_withをご確認ください。
form_withの記述も最初に説明した仕様通りで合ってるし、posts_controllerも悪いところがなさそう・・・。
自分の力ではこれ以上どうしようもなく、teratailに質問しようかと思いましたが、その前に過去質問を調べまくりました。
すると、この問題とは別ですが、「model: Post.new にしてみてください」というような回答があり、物は試しでやってみました。
・・・・できたーー!! キーにpostついてデータいったーー!!
成功したコード画面↓ model: @post → Post.new に変更。
ただ何故これで上手くいったんだ・・・?
原因を推測してみました。後出しになるのですが、このform_withの記述があるのはindexアクションで呼び出したページです。そして、posts_controllerを見ると def index ~ end の中に @post = Post.new がない。ということは、model: @post ではまだインスタンスが生成されておらず、postに紐づかなかったのではないか・・・。
そう納得しておきます。以上!\( ̄▽ ̄)/
この記事が初学者のお役に立てれば幸いです。
ためになった!という方は↓1円クリック募金してくれてもいいんだよ?