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