#はじめに
hamlでのformの書き方がまとまっていなかったのでまとめる
※form_tag
とform_for
はRails5.1
で非推奨となっており、将来的にform_with
に置き換えられる予定です。
極力、Rails5.1以上
とform_with
の使用を推奨します。
#Railsのformの種類
##1. form_tag
- 関連するモデルがない時に使用する(検索機能など)
- inputタグを用いる(ビルドヘルパーを用いない)
<%= form_tag users_path do %>
<%= text_field_tag :email %>
<%= submit_tag %>
<% end %>
##2. form_for
- 関連するモデルがある時に使用する(投稿機能など)
- ビルドヘルパー(
form.xxxx
)を用いる
<%= form_for @user do |form| %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
##3. form_with
- Rails5.1以上は問答無用でform_with
###form_tag/form_forとの違い
- form_withで自動でパスが選択されるので、HTTPメソッド(
get
やpost
など)を指定する必要が無い - コントローラーから渡されたActiveRecordを継承するモデルのインスタンスが利用できる
- form_withは、form_forとform_tagの機能を組み合わせたもの、とイメージすると分かりやすい
#関連するモデルがない場合 → 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 %>
#hamlでの書き方
この記事のメインはこちら
##form_tag
ビルドヘルパー(f.text_field
など)は記述しない点に注意
= form_tag users_path do
= text_field_tag :email
= submit_tag
##form_for
= form_for @user do |form|
= form.text_field :email
= form.submit
##form_with
#関連するモデルがない場合 → urlの指定のみで、modelの記述がない
= form_with url: users_path do |form|
= form.text_field :email
= form.submit
#関連するモデルがある場合 → modelの記述のみで、urlの指定は不要
= form_with model: @user do |form|
= form.text_field :email
= form.submit
##参考記事
【Rails】form_for/form_tagの違い・使い分けをまとめた
【Rails 5】(新) form_with と (旧) form_tag, form_for の違い