テックキャンプ日誌 Day32 (form_withについて)

テックキャンプ日誌(全70日間)

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円クリック募金してくれてもいいんだよ?