Rails form_tagとform_for
最近勉強ばかりしていますがインプットに対してアウトプットの量が圧倒的に少ないです。noteのエントリをひとつまとめるにも結構時間がかかったりするのでそんな時間があったら勉強進めたい・・・と後回しになってしまう悪い癖がでちゃってますね。そこを踏みとどまってアウトプットしていかなくちゃいけないんですが。
今回は Rails の form_tag と form_for の違いや使い分けの話です。ちなみにRails5.1から両方とも非推奨となっており、将来的にはform_with へ置きかわる予定だそうです。じゃあform_withだけ抑えておけばいいんじゃないかと思ったりもしますが現場で出会ったときに戸惑わないようにするためにも整理しておきます。
で、form_tag と form_forの違いですが一言でいうとmodelに基づくか否かの違いです。
form_tag : modelに基づかない
form_for : modelに基づく
既存のmodelに基づいたformを作成するときは form_for を使います、と。
# form_tag railsguide.jpより
<%= form_tag("/search", method: "get") do %>
<%= label_tag(:q, "Search for:") %>
<%= text_field_tag(:q) %>
<%= submit_tag("Search") %>
<% end %>
モデルにひもづかない検索フォームなんかは上のようにform_tagで。
# form_for railsguide.jpより
<%= form_for @article, url: {action: "create"}, html: {class: "nifty_form"} do |f| %>
<%= f.text_field :title %>
<%= f.text_area :body, size: "60x12" %>
<%= f.submit "Create" %>
<% end %>
一方form_forではarticleモデルのレコードがひとつ作成されるわけですね。このとき、:titleキーと:bodyキーを持ったハッシュがparams[:article]に含まれることになります。なのでarticleコントローラではストロングパラメータを作る際、以下のように書かないといけません。
# articles_controller.rb
def create
@article = Article.new(article_params)
# ...
end
private
def article_params
params.require(:article).permit(:title, :body)
end
何が言いたいかっていうとモデルにひもづけるform_forではrequire(:article)が必要!
上から順序立てて理解するとなんてことないけど形(コピペ)から入るとなんでここでrequireが必要なの?、なんでやぁーってなったので。
いいなと思ったら応援しよう!
サポートいただけましたら椅子から転げ落ちて喜びます。