くるみ
- form_forとform_tagって何が違うの?
- 今まで何となく使ってたけど違いを知りたい
という方に向けてform_forとform_tagメソッドの違いを自分の備忘録がてらまとめてみました。
参考になれば幸いです⸝⸝- ̫ -⸝⸝
お品書き
Railsのform_forとform_tagの違い
まずは結論から。
- form_forはとあるモデルオブジェクトのデータをいじる時に便利なフォームを生成してくれるメソッド
- form_tagはそれ以外のケースで用いることの多い、フォームを生成してくれる汎用性の高いメソッド
ブログ主
form_forとform_tagの使い方
form_tagメソッド
<%=form_tag(controller: :post,action: :search) do %>
<%=text_field_tag :word%>
<%=submit_tag("探す")%>
<%end%>
form_tagはモデルオブジェクトに関連付かないフォームを生成する時に使われるケースが多いです。
form_forメソッド
<%=form_for(@post) do |form|%>
<%=form.text_field :name%>
<%=form.text_field :age%>
<%=form.submit("投稿する")%>
<%end%>
それに比べて、form_forはこのようにモデルオブジェクトを扱う際にとても便利なものです。
引数で渡しているモデルオブジェクト(上でいう@post)が既にテーブルに保存されているものか、などを判断して、自動的に送信先などを決めてくれます。便利。神。
@dataにデータが保存されていればそのフォームの初期値がそのカラムの値にしてくれもします。
くるみ
ブログ主自身もフォーム設置する時は「とりあえずform_for使ってとけばOKンゴ」と勉強したので、脳死で使っていたのですが…
form_tagでもモデル編集が出来る
form_tagでモデルオブジェクトと関連づけようとして書くとなるとこんな感じ。
<%=form_tag(action: :create) do%>
<%=text_field :post,:name%>#アクション内でpostというテンプレート変数を用意した場合
<%=text_field :post,:age%>
<%end%>
…うーんなんかゴチャゴチャしてる?
そこまで書くものが増えたわけではありませんが、form_forに比べると少し多いです。
事実、こっちでは「:post」とオブジェクト名を何度も書かなきゃいけないのに比べて、form_forは一度書けばいいですからね。
おまけ:それぞれのヘルパー
form_tagを用いた時に使う、上で言う「text_field_tag」のようなものをFormTagヘルパーと言い、form_forを用いたを時に使う、上で言う「text_field」のようなものをFormヘルパーと言いますが…
実はform_forを使った時でもFormTagヘルパーを使うことはできます。
ブログ主
まとめ
form_forメソッドとform_tagメソッド、モデルオブジェクトに関連するフォームを生成する場面の方が多く更に便利なのでform_forをとりあえず使っておけばいいと思いますが…
「form_tagもある」ということを頭の片隅に留めておくのがいいかもしれませんね。
くるみ