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 を覚えていたのでショックだった。便利。