【Rails 5.1】 form_withの使い方

ProgateでRails学習してる方も多いと思いますが、Progateのフォーム機能実装ではform_tagを使用してます。 現在Rails5.1以降ではform_withのみ使用を推奨してるので、学習した内容のメモとして、今までのform_tagform_forの違いや、 form_withの機能をまとめてみました。

目次:

form_tagform_for違いについて

form_for: 任意のmodelに基づいたformを作るときに使う
form_tag: modelに基づかないformを作るときに使う

関連するモデルが無し form_tag

<%= form_tag users_path do %>
  <%= text_field_tag :email %>
  <%= submit_tag %>
<% end %>

関連するモデルが有り form_for

<%= form_for @user do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>

form_withについて

関連するモデルが無し form_with

<%= form_with url: users_path do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>

url:を指定する 関連するモデルが有り form_with

<%= form_with model: @user do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>

model:を指定

これまでのモデル有無に関わらずform_withのみで記述可。

form_withでは最初からremote: trueの状態

これまではform_forや、form_tagではajaxの実装の為にremote: trueをつける必要がありましたが、form_withでは最初からtrueになっています。

その為、ajaxを使用しない場合にはremote: falseを記述する必要があります。

また、通常のページ遷移するフォーム送信の場合にはlocal: trueで記述する必要があります。