...

【Rails】form_forとform_tagの違いとは?分かりやすくまとめてみた

Railsのform_forとform_tag

どうもおはようポテト(@ohayoupoteto22)です。

form_forとform_tagの違いってなんぞ?

ということで今回は

  • 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にデータが保存されていればそのフォームの初期値がそのカラムの値にしてくれもします。

edtitで編集する時とかだね

くるみ

「form.」に後述するかたちでフォームのパーツのメソッドを書いてあげると設置できます。

ブログ主自身もフォーム設置する時は「とりあえず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ヘルパーを使うことはできます。

ブログ主

これ最近知った

まとめ

以上、Railsのform_forとform_tagの違いについてでした。

form_forメソッドとform_tagメソッド、モデルオブジェクトに関連するフォームを生成する場面の方が多く更に便利なのでform_forをとりあえず使っておけばいいと思いますが…

「form_tagもある」ということを頭の片隅に留めておくのがいいかもしれませんね。

うぬぬ…Railsは奥が深いね…

くるみ

参考になれば幸いです!では⸝⸝- ̫ -⸝⸝

参考になったらシェアしよう

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA