...

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

Railsのform_forとform_tag

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

Railsにおいて、ビューにてフォームを生成してくれるform_forメソッド。

しかし同じくフォームを生成してくれるform_tagというメソッドも存在します

 

…そこで生まれた疑問がこちら。

 

…ということで今回は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ヘルパーを使うことはできます。

ブログ主

これ最近知った

最後に

以上となります。

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

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

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

ソロモン

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

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

コメントを残す

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

CAPTCHA