##form_with
form_tagとform_forというのもあるのですが、Rails 5.1系以降ではform_withが推奨されています。
自動でパスを選択してくれて、HTTPメソッドを指定する必要がありません。
コントローラーから渡された、ActiveRecordを継承するモデルのインスタンスが利用できます。
inputタグは入りません。
これらの特徴はform_forとform_withの共通する部分です。
##そもそもform_tagとform_forとは
簡単にいうとモデルの有無です。例えば検索機能の場合はモデルが必要ないのでform_tagを使います。
【例】form_tag
<%= form_tag('XXXX_path', method: :post) do %>
(中身)
<% end %>
上記みたいにパスを指定したりします。まだいろいろと記述の仕方はあるのですが今回はform_withなので省きます。
【例】form_for
%= form_for @XXXX do |form| %>
(中身)
<% end %>
コントローラーで@XXXXを定義しています。内容はこちらも省いていきます。
##form_withの記述
form_withは、form_forとform_tagの機能を組み合わせたものです。なのでform_withひとつでどちらも対応できます。
【例】form_with
<%= form_with(model: @XXXX, local: true) do |form| %>
<h3>
投稿する
</h3>
<%= form.text_field :name, placeholder: "ニックネーム" %>
<%= form.text_field :image, placeholder: "Url" %>
<%= form.text_area :text, placeholder: "text", rows: "10" %>
<%= form.submit "送信" %>
<% end %>
コントローラーで@XXXXを定義しています。
##local: trueオプション
form_withでは、デフォルトの状態ではremote: trueというajaxでの通信が行われる設定になっています。それをキャンセルするためにlocal: trueというオプションを付与します。local: trueオプションを付与すれば、Railsのフォームと同様に使用することが出来ます。