フォーム作成のメソッド
-
form_tag
:(旧)モデルに関連しないフォームの作成に使う -
form_for
:(旧)モデルに基づくフォームの作成に使う -
form_with
:(新)モデルに関わらず、フォームの作成に使う。
※ Rails5.1以前では、データ登録や更新ではform_for、検索ではform_tagで実装する、というような使い分けを行う。
※ 但し、form_tag
、form_for
は Rails5.1以降は、非推奨。今後は form_with
を使ってね!という事。
※ form_for
とform_with
は、自動でパスを選択し、HTTP指定の必要なし、inputタグを用いないことは共通の特徴。
form_tag
指定するのは、URL(パス)とHTTPメソッド(put、post、patch)の2つ。
httpのデフォルトはgetになっている。
基本の構造
<%= form_tag(URL, HTTPメソッド) do %>
:
<% end %>
例
<%= form_tag('/items', method: :post, class:"class_name", id:"id_name") do %>
<% end %>
<%= form_tag(items_path, method: :post) do %>
<% end %>
<!-- コントローラーとアクションで指定する場合 -->
<%= form_tag({:controller => 'items', :action => 'create'},
{:method => :post}) do %>
<% end %>
<!-- シンボル型 -->
<%= form_tag({controller: :items, action: :create}, {method: :post}) do %>
<% end %>
<!-- 画像などのファイル登録の場合 -->
<%= form_tag('/items', method: :post, multipart: true) do %>
<% end %>
<!-- Ajax通信の場合 -->
<%= form_tag('/items', method: :post, remote: true) do %>
<% end %>
フォームヘルパー
<%= label_tag :表示したい文字 %> <!-- ラベル表示 -->
<%= text_field_tag :name %> <!-- 1行テキスト params[:name]に値が入る -->
<%= text_area_tag :content %> <!-- 複数行テキスト params[:content]に値が入る -->
<%= submit_tag "送信" %> <!-- 送信ボタン -->
form_for
既に保存されている場合は、updateアクション、未保存の時は、createアクションを、自動的に選んでくれる。特別なパスやアクションを呼び出したい時は、url、methodを指定する。
form_forにclassやid名をつけたい時はhtmlオプションを使用する。
基本の構造
<%= form_for モデル名 do |f| %>
:
<% end %>
<%= form_for モデル名, url: 自分で定義したパス, method: HTTPメソッド, html: {class:'class_name', id:'id_name'} do |f| %>
:
<% end %>
例
<% form_for @items do |f| %>
<% end %>
<% form_for([:name, @items]) do |f| %>
<% end %>
フォームヘルパー
<!-- ラベル -->
<%= f.label :name %>
<!-- 一行のテキスト入力 -->
<%= f.text_field オブジェクト名, プロパティ名 [, オプション] %>
<%= f.text_field :name, class: "class_name", maxlength: 40 %>
<%= f.text_field :name, id: :text_name %>
<!-- 複数行のテキスト入力 -->
<%= f.text_area オブジェクト名, プロパティ名 [, オプション] %>
<%= f.text_area :content, class: "class_name", size: "100x50" %> <!-- サイズ指定はcols×rows -->
<!-- メールアドレス入力 -->
<%= f.email_field オブジェクト名, プロパティ名 [, オプション] %>
<!-- 数字入力 -->
<%= f.number_field オブジェクト名, プロパティ名 [, オプション] %>
<%= f.number_field :item_id, min: 1, max: 150 %>
<!-- パスワード入力 -->
<%= f.password_field オブジェクト名, プロパティ名 [, オプション] %>
<!--日時の入力 -->
<%= f.datetime_field オブジェクト名, プロパティ名 [, オプション] %>
<!-- selectボックス(DBからデータ生成しない:select / する場合:collection_select) -->
<%= f.select オブジェクト名, プロパティ名, タグの情報 [, オプション] %>
<%= f.select :category, Category.all, include_blank: true %>
<%= f.collection_select :category, Category.all, :id, :name, include_blank: true %>
<!--日付選択selectボックス フォーマットは年月日。例)日が不要であれば{:discard_day => true}) -->
<%= f.date_select :date, {:discard_day => true}, {start_year: 1950, end_year: 2050}, default: {year: 1950, month: 1} %>
<!-- ファイル添付 -->
<%= f.file_field オブジェクト名, プロパティ名 [, オプション] %>
<!-- チェックボックス(DBからデータ生成しない:check_box / する場合:collection_check_boxes) -->
<%= f.check_box オブジェクト名, プロパティ名 [, オプション, checked_value = "1", unchecked_value = "0"] %>
<%= f.collection_check_boxes(:name, :ids, Item.all, :id, :name) do |b| %>
<%= b.label {b.check_box + b.text} %>
<% end %>
<!-- ラジオボタン -->
<%= f.radio_button "カラム名", "保存したい内容" %>
<%= f.collection_radio_buttons(:items, :ids, Item.all, :id, :name) do |b| %>
<%= b.label {b.radio_button + b.text} %>
<% end %>
<!-- 非表示:入力しない情報をパラメーターに送る時に使用 -->
<%= f.hidden_field :カラム名, value: "値" %>
<%= f.hidden_field :user_id, value:current_user.id %>
<%= f.hidden_field 'モデル名[user_ids][]', value: current_user.id) %>
<!--送信ボタン -->
<%= f.submit "送信ボタン" %>
<!-- fontawesomeのアイコンを使う時は、button_tagを使うと良さそう(※ f.submit でエラーのため) -->
<button name="button" type="submit" class="btn comment_btn">
<i class="fas fa-comment-dots">コメント</i>
</button>
form_with
モデルへの送信は、form_for と同様に、URL、スコープが自動推測される。Rails 5.2以降では、id属性も自動付与される。
フォーマットがAjax送信なので、HTML送信には、local: trueをつける必要がある。
フォームヘルパーはform_forと同じ書き方。
基本の構造
<!-- DBに保存しない時 -->
<%= form_with url: パス do |f| %>
:
<% end %>
<!-- DBに保存する時 -->
<%= form_with model: モデルのインスタンス do |f| %>
:
<% end %>
例
<% form_with model: @item, local: true, class: "class_name", id: "id_name" do |f| %>
<% end >
<%= form_with @item, url: {controller: 'items', action: 'index'} do |f| %>
<% end %>