Help us understand the problem. What is going on with this article?

【Rails】form_forの基本の基

フォーム作成のメソッド

  • 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 %>
manbolila
プログラミング初心者です。Rails勉強中です。学びや躓いた点を備忘録として投稿していきます。同じ間違いを繰り返さない様に!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした