LoginSignup
16
31

More than 3 years have passed since last update.

[Rails]hamlでのform_with/form_for/form_tagの書き方

Last updated at Posted at 2020-03-17

はじめに

hamlでのformの書き方がまとまっていなかったのでまとめる

form_tagform_forRails5.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メソッド(getpostなど)を指定する必要が無い
  • コントローラーから渡された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 の違い

16
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
31