はじめに
自分が初めてform_with/form_forの文法を学んだ時に「???」となったので、
初学者にも分かるような説明記載と自分の備忘録として記載します。
まず、はじめに「form_for」はRails5.1で非推奨となっており、将来的にform_withに置き換えられる予定です。
「Rails5.1以上」と「form_with」の使用が推奨とされております。(2020/5/14現在)
「form_for」と「form_with」
1.form_for
- Railsでフォームタグを簡単に作成するためのメソッド
- モデルに基づくformに使用される
form_forは以下のように書きます。
<%= form_for モデル do |form| %>
<%# フォームの部品 %>
<% end %>
具体的なコードで書くと、
※モデルはUserとする
<%= form_for @user do |form| %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
__Rails特有__のhamlで書くと、
= form_for @user do |f|
= f.text_field :email
= f.submit
2.form_with
- 自動でパスを選択してくれ、HTTPメソッド(getやpostなど)を指定する必要が無い
- コントローラから渡された、ActiveRecordを継承するモデルのインスタンスが利用できる
- モデルに基づかないフォームも生成できる
form_withは以下のように書きます。
<%= form_with model:'モデル名' local: true do |form| %>
<%# フォームの部品 %>
<% end %>
上記の説明で取り上げた通り、form_withは、モデルに基づかないファームも生成できます。
具体的なコードで書くと、
※モデルはUserとする
#関連するモデルがない場合 → urlの指定のみで、modelの記述がない
<%= form_with url: users_path do |form| %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
#関連するモデルがある場合 → modelの記述のみで、urlの指定は不要
<%= form_with model: @user do |form| %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
__Rails特有__のhamlで書くと、
#関連するモデルがない場合 → urlの指定のみで、modelの記述がない
= form_with url: users_path do |f|
= f.text_field :email
= form.submit
#関連するモデルがある場合 → modelの記述のみで、urlの指定は不要
= form_with model: @user do |f|
= form.text_field :email
= form.submit
「form_for」と「form_with」の違い
1.localは、記載の必要あり。
2.remote(Ajax)は、基本的にtrue設定で記載の必要なし。
3.form_withではinputタグは用いない
上記の1と2に関しましては、以下の記事が参考になりますので、興味がございましたらご参照下さい。
https://qiita.com/Tatsu88/items/8ea9b944681a48cce589#comment-85443e109252b344989b
最後に
これからは form_with を使うことを強くお勧めします。
もしこの記事がみなさんの役に立てば幸いです。
以上となります。最後までご覧いただき、ありがとうございました!
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。
参考記事
【Rails 5】(新) form_with と (旧) form_tag, form_for の違い
form_for/form_tag/form_withについて【概要+使い方】
【Rails入門説明書】form_withについて解説