form_withって難しい(n回目)

form_withっていろいろな情報があって、何が何やらさっぱりなので、少しまとめて行きたいと思います。たくさん参考にしながらやっていきます。

form_tagとform_for

まず、form_withは第一引数にmodel:かurl:を使います。この使い分けは、

<%= form_with url: "パス" do |form| %>
  フォーム内容
<% end %>
<%= form_with model: モデルクラスのインスタンス do |form| %>
  フォーム内容
<% end %>

なぜ、この2つに分けられているのかというと、もともとform_withform_tagform_forが使われていました。form_tagは保存する必要がない時、form_forは保存する必要があるときに使います。

<%= form_tag('/main', method: :post) do %> 
  <input type="text" name="nickname"> 
  <input type="submit"> 
<% end %>
<%= form_for(@user) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

form_tagform_forで書き方が異なることが分かります。form_forでは、FormBuilderオブジェクトのヘルパーメソッドを使っています。FormBuilderオブジェクトとは、上の例だとform_forというヘルパーメソッドの引数である@userの情報を持っている「f」です。フォームを作るときに便利なヘルパーメソッドを使うことができます。form_forによって作られるオブジェクトということなのかな?text_fieldやsubmitなど便利なヘルパーメソッドを使えます。

form_withとは

form_tagform_forくっつけたらもっと簡単なのになー。モデルでもパスでもどっちも使えたらなー。ということで、form_withが誕生したらしいです。 使い方をもう一度

<%= form_with model: @user do |form| %>
  フォーム内容
<% end %>
<%= form_with url: root_path do |form| %>
  フォーム内容
<% end %>

form_withでmodelオプションを使う場合は、引数にモデルクラスのインスタンスを指定します。モデルクラスのインスタンスとは、保存したいテーブルのクラスのインスタンスのことをいうそうです。よく分かりません。 進めます。usersテーブルに新たにレコードを作成したいので、コントローラーに

def new
  @user = User.new
end

と記述します。この@userがform_withの引数に指定されるのです。@userが新規に作成された場合(@userになんの情報も入っていない)には、createアクションへ、@userにすでに情報が入っている場合にはeditアクションへ自動的にform_withが振り分けてくれます。

参考

https://pikawaka.com/rails/form_with https://qiita.com/kenkentarou/items/f6b2f033d8b14056ec81