form_for/form_tag/form_withについて【概要+使い方】

#はじめに
今回は、form_for/form_tagの違いについて、纏めるとともに、直近で使用されているform_withについても記載いたします。
＊今後はform_withが主流になるとのことなので、今後からの学習する場合は、**form_with**での学習をお勧めします！

#form_for/form_tag/form_withの違いについて
form_forとform_tagの違いは、基本的に**モデルの有無**です!
form_forはモデルがある場合に使用し、form_tagはモデルが無い時に使用します。
そして最新環境で使用されているform_with。
こちらはform_tagとform_forの一人二役となっております。
しかしながら、基本的にはform_forとform_tag同様、モデルの有無によって記述が異なるため、
状況に応じて、記述内容を変える必要はございます。

上記に加えてlocalとremoteの設定に違いがございます。
○form_tag/form_for:
-localは、基本的にtrue設定で記載の必要なし。
-remote(Ajax)は、記載の必要あり。

○form_with:
-localは、記載の必要あり。
-remote(Ajax)は、基本的にtrue設定で記載の必要なし。
*上記に関して、以下の記事に詳細有りますので、興味ございましたら、ご参照いただけますと幸いです。
https://qiita.com/Tatsu88/items/8ea9b944681a48cce589#comment-85443e109252b344989b


早速、各々の使用方法を記載していきます。

#各機能と使い方
##form_for（機能と使い方）
-機能：railsで情報を送信するためのヘルパーメソッド
　　　特定のテーブルにレコードを新規作成する。*モデルがある時に使用（投稿など）
-使い方

```
<%= form_for(インスタンス*@~) do |f| %>
 f.htmlタグ:カラム名
end
```
*form_forは引数のインスタンスが何も情報を持っていなければ自動的にcreateアクションへ、
 既に情報を持っている場合はupdateアクションへ自動的に振り分けます。
*基本的にform_forを利用する際には、二重ハッシュ（モデル名とバリュー）で情報が飛ばされます。
 そのため、コントローラー上、requireでモデル指定・permitでバリュー指定が必要になります。

```:controller
params.require(:モデル名).permit(:バリュー名）
```

**メソッド = 用途**
  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_tag（機能と使い方）
-機能：railsで情報を送信するためのヘルパーメソッド
　　　 特定のテーブルにレコードを新規作成する。*モデルがない時に使用（検索など）
-使い方

```
#パターン１（URLで指定）
<%= form_tag('URL’, method: :メソッド名) do %>
  中身
end

#パターン２（PATH＊名前付きルートで指定）
<%= form_tag('PATH’, method: :メソッド名) do %>
  中身
end

#中身(例)
  <%= label_tag :名前 %>
  <%= text_field_tag :name %>
  <%= label_tag :内容 %>
  <%= text_area_tag :content %>
  <%= submit_tag "追加" %>

```
中身に関しては、基本的に"_tag"を使用します。
＊上記以外にコントローラとアクション指定・シンボル指定などのパターンがありますが、割愛いたします。
（参照URLにございますので、気になる方はご参照ください）
いずれの場合もpostメソッドの場合は、記述しなくてもRailsが自動的にpostと判断してくれるので省略することもできます。

##form_with（機能と使い方）
form_forとform_tagの違い・使い方を説明いたしましたので、最後にform_withについて、まとめていきます。
<form_with>
-機能/特徴：
-form_tagとform_forの一人二役。しかしながら、基本的にはform_forとform_tag同様、モデルの有無によって記述が異なる。
-form_withで自動でパスを選択してくれて、HTTPメソッドを指定する必要が無い
-コントローラから渡された、ActiveRecordを継承するモデルのインスタンスが利用できる
-form_withではinputタグは用いない
-使い方
　-モデルあり

```
<%= form_with model:'モデル名' do |form| %>
　　中身
<% end %>
```

ーモデルなし

```
#パターン１（URLで指定）
<%= form_with url:"url" do |form| %>
　中身
<% end %>

#パターン2（PATHで指定）
<%= form_with url:’PATH’ do |form| %>
　中身
<% end %>
```
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 |
オプション使用例

```haml:例
= form_with(method: :patch, url:"/users/#{@user.id}", local:true) do |form| %> 
      = f.label :ニックネーム
      = f.text_field :name, {placeholder: "例)太郎",class:'form-group__input'}
    .form-group
      = f.label :メールアドレス
      %span.form-group__require 必須
      = f.email_field :email, {autofocus: true, autocomplete: "email", placeholder: "PC・携帯どちらでも可",class:'form-group__input'}
      = f.submit '次へ', class: "btn-default btn-red", url: "address_path"
```

#メモ
##text_area内で改行をviewに反映させる
text_area内で改行をしても実際のviewには反映されませんが、以下の方法にて、反映させることができます。

1.simple_format
 
Railsのヘルパーの一種で、文字列を下記の条件で加工してくれます。
 -文字列を"p"で括る
 -改行は"br/"を付与
 -連続した改行は、"/p" "p"を付与

```:例
= simple_format(@user.introduction)
```

2.safe_join

"p"タグで括りたく無い場合はsafe_joinが使用できます。

```:例
= safe_join(@user.introduction.split("\n"), tag(:br))
```


以上

以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。

#参考　
【永久保存版】Railsのform_for使い方（select, checkbox, etc.）
https://www.sejuku.net/blog/13163

【Rails入門】form_tagの使い方まとめ
https://www.sejuku.net/blog/29083

【Rails】form_withの使い方を徹底解説！
https://www.pikawaka.com/rails/form_with#form_with%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

form_with — Building HTML forms in Rails 5.1
https://medium.com/@tinchorb/form-with-building-html-forms-in-rails-5-1-f30bd60ef52d

Rails 5.1's form_with vs. form_tag vs. form_for
https://m.patrikonrails.com/rails-5-1s-form-with-vs-old-form-helpers-3a5f72a8c78a

【Rails入門説明書】form_withについて解説
https://web-camp.io/magazine/archives/17665

【Rails】form_withの使い方を徹底解説！
https://pikawaka.com/rails/form_with#form.text_field