12
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】form_forの基本の基

Last updated at Posted at 2020-04-30

フォーム作成のメソッド

  • form_tag:(旧)モデルに関連しないフォームの作成に使う
  • form_for:(旧)モデルに基づくフォームの作成に使う
  • form_with:(新)モデルに関わらず、フォームの作成に使う。

※ Rails5.1以前では、データ登録や更新ではform_for、検索ではform_tagで実装する、というような使い分けを行う。
※ 但し、form_tagform_forは Rails5.1以降は、非推奨。今後は form_withを使ってね!という事。
form_forform_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 %>
12
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?