はじめに
こんにちは!Railsでユーザー登録や投稿フォームを作るとき、<form>
タグの複雑さに頭を抱えたことはありませんか? action
のURLはこれで合ってる? method
はpost
? あの呪文みたいなauthenticity_token
って何だっけ…?
そんな面倒な作業からあなたを解放してくれる、Railsの魔法の道具が**form_with
ヘルパー**です!
form_with
がない世界(手書きの茨の道)
もしform_with
がなかったら、私たちはユーザー登録フォームを以下のように全部手で書く必要があります。
<form action="/users" method="post">
<input type="hidden" name="authenticity_token" value="(毎回変わる秘密の文字列)">
<label for="user_name">名前</label>
<input type="text" id="user_name" name="user[name]">
<label for="user_email">メールアドレス</label>
<input type="email" id="user_email" name="user[email]">
<input type="submit" value="登録する">
</form>
これは大変です。URLやセキュリティ対策、各input
タグのname
属性など、一つでも間違えると正しく動作しません。
form_with
の魔法(Railsという名の絨毯に乗って)
form_with
を使えば、上記の複雑なフォームが信じられないほどシンプルになります。
▼ RailsのView (Slim記法) で書いた場合
= form_with model: @user do |f|
.field
= f.label :name
= f.text_field :name
.field
= f.label :email
= f.email_field :email
.actions
= f.submit
たったこれだけで、先ほどの手書きHTMLとほぼ同じものが、安全かつ正確に生成されます。
なぜこんなに短くなるの? form_with
の自動化機能
form_with
は、渡されたモデルオブジェクト(@user
)の状態を見て、たくさんのことを自動で判断してくれます。
-
適切なURLとHTTPメソッドを自動設定 🤖
-
@user
が新規 (User.new
) なら 👉 登録用のフォーム (action="/users"
,method="post"
) を生成。 -
@user
が既存 (User.find(1)
) なら 👉 更新用のフォーム (action="/users/1"
,method="patch"
) を生成。
-
-
セキュリティ対策を自動化 🛡️
- CSRF(クロスサイトリクエストフォージェリ)攻撃を防ぐための
authenticity_token
を自動で埋め込んでくれます。
- CSRF(クロスサイトリクエストフォージェリ)攻撃を防ぐための
-
入力項目とモデルを自動で紐付け 🔗
-
f.text_field :name
と書くだけで、モデルのname
属性と関連付けられたname="user[name]"
という属性を自動で生成します。
-
おわりに
form_with
の 素晴らしさが少しでも伝われば嬉しいです☺️