dev/mom0tomo

技術メモ

form_forとform_tagはform_withへ統合された(Rails 5.1)

読んだもの

Ruby on Rails 5.1リリースノート | Rails ガイド

学んだこと

なんとRails5.1から統合されていた。マジカヨ...

  • form_for : Modelに基づいたformを作るときに使う
  • form_tag : Modelに基づかないformを作るときに使う(検索フォームなど)

と覚えていたが...

現在は下記のように書く。

form_forのように使う場合

<%= form_with model: Post.new do |form| %>
  <%= form.text_field :title %>
<% end %>
 


# ↓生成されるタグ
 
<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

既存のモデルに対してupdate的に使う場合はこちら。

<%= form_with model: Post.first do |form| %>
  <%= form.text_field :title %>
<% end %>
 


# ↓生成されるタグ
 
<form action="/posts/1" method="post" data-remote="true">
  <input type="hidden" name="_method" value="patch">
  <input type="text" name="post[title]" value="<postのtitle>">
</form>

form_tagのように使う場合

<%= form_with url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>
 


# ↓生成されるタグ
 
<form action="/posts" method="post" data-remote="true">
  <input type="text" name="title">
</form>

inputフィールド名にスコープを追加する場合はこちら。

<%= form_with scope: :post, url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>
 


# ↓生成されるタグ 
 
<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

結構がんばってform_for / form_tag を覚えていたのでショックだった。便利。