yuuki blog

プログラミング をアプトプットしています。

form_for form_tag form_with について

form_for/form_tag/form_withの違い

form_forとform_tagの違いは、基本的にモデルの有無です!

form_forはモデルがある場合に使用し、form_tagはモデルが無い時に使用します。

そして最新環境で使用されているform_with。 こちらはform_tagとform_forの一人二役となっております。

 

form_for

railsで情報を送信するためのヘルパーメソッド

特定のテーブルにレコードを新規作成する。*モデルがある時に使用(投稿など)

<%= form_for @user do | form | %> 
 #form_forは引数のインスタンスが何も情報を持っていなければ自動的にcreateアクションへ
 #既に情報を持っている場合はupdateアクションへ自動的に振り分けます
<%= form.text_field:email%> #f.htmlタグ:カラム名
<%= form.submit%>
<%end%>

form_tag

railsで情報を送信するためのヘルパーメソッド 特定のテーブルにレコードを新規作成する。*モデルがない時に使用(検索など)

<%= form_tag users_path do %> 
#form_tag('PATH’, method: :メソッド名)
<%= text_field_tag :email %>
#中身に関しては、基本的に"_tag"を使用します
<%= submit_tag %>
<% end %>

form_with

form_tagとform_forの一人二役、基本的にはform_forとform_tag同様、モデルの有無によって記述が異なる。

form_withで自動でパスを選択してくれて、HTTPメソッドを指定する必要が無い

コントローラから渡された、ActiveRecordを継承するモデルのインスタンスが利用できる

form_withではinputタグは用いません

モデルなし
<%= form_with url:users_path do | form | %> 
<%= form.text_field:email%>
<%= form.submit%>
<%end%>
モデルあり
<%= form_with model:@user do | form | %> 
<%= form.text_field:email%>
<%= form.submit%>
<%end%>

モデルを渡したときは、URLとスコープが自動推測されます。

URL: @userがDBにある時はupdateアクションに、無い時はcreateアクションに飛びます。

スコープ: params[:email] が params[:user][:email] になります。

メソッド の種類

  • f.label : labelのlabelタグを表示
  • f.text_field : textのinputタグを表示
  • f.date_select : モデルで設定したフィールドをselectタグで選べるようにして表示
  • f.check_box : checkboxのinputタグを表示
  • f.number_field: numberのinputタグを表示
  • f.submit : submitのinputタグを表示
  • f.collection_check_boxes : collection check boxの表示

form_with ヘルパー表

     
オプション 説明 デフォルト値
:url フォームに入力されたデータを送信するURL。名前付きルートを直接使用可能 nil
:method HTTPリクエスト(HTTPメソッド)の指定。 POST
:format 送信するデータ形式 JSON形式やXML形式など:urlオプションが指定された場合は無視される text/html
:scope ルーティングで名前空間が指定されている場合に利用するプレフィックス指定 nil
:model モデルオブジェクト。オブジェクトが新規レコードの場合は作成フォームが生成され、既存レコードの場合は更新フォームが生成される nil
:authenticity_token 認証トークンの指定。カスタム認証トークンでオーバーライドするかfalse、認証トークンフィールドをスキップします。  
:local リモートフォームを使わない設定 false
:skip_enforcing_utf8 IE5以前の文字化け対策(UTF-8の矯正送信)のスキップ設定 false
:builder フォームオブジェクトのオーバーライド(オリジナルフォームコントロールの作成) nil
:id オプションのHTML id属性 nil
:class オプションのHTMLクラス属性 nil
:data オプションのHTMLデータ属性 nil
:html id、class、data以外のオプションHTML属性 nil