❶form_withとは
♦︎情報を送信するためのヘルパーメソッドの一つ。
♦︎セキュリティー対策などが組み込まれた、安全なHTMLのformタグを作成できる。
♦︎つまりは投稿ページを作るときのフォームを実装するためにある。
<%= form_with(model or scope or URL [,オプション]) do |f| %>
<% end %>
この|f|はブロック変数、つまり特定の範囲内で使える変数のことです。
このdo〜endの範囲でのみ使うことができます。
変数の違いがわからない方はこちら↓
form_withのオプション
オプション | 指定 | デフォルト値 |
---|---|---|
:model | モデルを指定 | |
:scope | スコープを指定 | |
:url | URL指定 | |
:local | リモート送信の無効 | false |
:method | HTTPメソッドを指定 | POST |
:local
form_withではデフォルトが非同期通信になってる(Rails6.1からは同期通信がデフォルトになってるらしいので自分のバージョンに注意!)ので、引数で"local: true"を渡してあげることで、通常の同期通信を実装することができます。
上記のオプションはよく使用する一例で、使用できるオプションは他にもありますので公式ドキュメントを参照ください。
❷form_withを使ってみる
先ほどの基本形をベースに「モデルを指定するかorどのURLへデータを送るかorどのHTTPメソッドで送るか」を定義します。
<%= form_with model: Post.new do |f| %>
<% end %>
<%= form_with url: posts_path do |f| %>
<% end %>
♦︎①のmodelを指定するとデータベースに保存される。②のurl指定は送る情報をデータベースに保存しない
♦︎form_wothのベースができたら、このform_with〜endの範囲にテキストフィールドやボタンを設置していく
modelと連携した場合の便利な機能
☑︎form_withはモデルと連携することで、データの保存が簡単にできる
☑︎引数として渡されたモデルクラスのインスタンスの中身の有無で、アクションをcreateかupdateに勝手に振り分けてくれる
勝手に振り分けるってどう言うこと??となった方は下記記事がとてもわかりやすいので参照ください。
〜form_withとモデルオブジェクト〜
モデルオブジェクト
タイトルや本文、ボタンを実装するためのヘルパー。
これらの部品を作成するヘルパーをモデルオブジェクトと言います。
モデルオブジェクトの例
使用場面 | モデルオブジェクト |
---|---|
単一行のテキストフィールド(titleとか) | text_field |
複数行のテキストフィールド (本文とか) | text_area |
送信や投稿ボタン | submit |
これらのモデルオブジェクトを作成するために、冒頭で説明したあの|f|ことブロック変数を使用します。
<%= form_with model: Post.new do |f| %>
<%= f.text_field :title %>
<% end %>
♦︎ブロック変数の|f|にはモデル(ここで言うならPostモデル)の情報が入っているので、Postモデルにあるtitleカラムと判別することができ、データベースに保存ができる。
❸投稿フォームの作成
<h1>新規投稿</h1>
<!-- 以下form_withの例 -->
<%= form_with model: Post.new do |f| %>
<h3>タイトル</h3>
<%= f.text_field :title %>
<h3>本文</h3>
<%= f.text_area :body %>
<%= f.submit '投稿' %>
<% end %>
以上になります。下記も参照させていただきました。