【Rails】form_forの基本の基

# フォーム作成のメソッド
- `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になっている。

```html:基本の構造
<%= form_tag(URL, HTTPメソッド) do %>
    :
<% end %>
```

```html:例
<%= 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 %>
```
```html:フォームヘルパー
  <%= 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オプションを使用する。

```html:基本の構造
<%= form_for モデル名 do |f| %>
    :
<% end %>

<%= form_for モデル名, url: 自分で定義したパス, method: HTTPメソッド, html: {class:'class_name', id:'id_name'} do |f| %>
    :
<% end %>
```
```html:例
<% form_for @items do |f| %>
<% end %>

<% form_for([:name, @items]) do |f| %>
<% end %>
```

```html:フォームヘルパー
 <!-- ラベル -->
  <%= 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と同じ書き方。

```html:基本の構造
<!-- DBに保存しない時 -->
<%= form_with url: パス do |f| %>
    :
<% end %>

<!-- DBに保存する時 -->
<%= form_with model: モデルのインスタンス do |f| %>
    :
<% end %>
```
```html:例
<% 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 %>
```