form_forとform_with
違いってなんだっけ?の人向けです。
概要
railsの環境をデプロイのために合わせる必要があリます。
使い分けとは?
railsで投稿フォームを作成するにはセキュリティの面から直接inputタグを利用して書くことはありません。
投稿フォームを作成するにはform_tagやform_for、form_withといったヘルパーメソッドを使用します。
保存するテーブルが存在する場合
投稿フォームに投稿された内容を保存するテーブルが存在するときにはform_forを使います。
保存するテーブルが存在しない場合
検索フォームのようなフォームは検索ワードを入力してもらうだけでそのワードはデータベースに保存する必要はない場合、フォームはform_tagで作成します。
rails5.1からはform_withを使うことが推奨されています
form_withはrails5から使えるようになったヘルパーメソッドで、保存する内容がない場合でもform_forと同じようなコードで書くことができます。
共通の特徴
form_forとform_withの間には細かな違いはあるものの、使用感が大きく異なることはありません。
自動でパスを選択してくれて、HTTPメソッドを指定する必要が無いこと
コントローラーから渡された、ActiveRecordを継承するモデルのインスタンスが利用できること
inputタグは用いないこと
これらの特徴は共通です。
form_forとform_withで書いた時の違いを比較しましょう。
【例】form_forで書いたフォーム
<div class="contents row">
<div class="container">
<%= form_for @tweet do |form| %>
<h3>
投稿する
</h3>
<%= form.text_field :name, placeholder: "Nickname" %>
<%= form.text_field :image, placeholder: "Image Url" %>
<%= form.text_area :text, placeholder: "text", rows: "10" %>
<%= form.submit "SEND" %>
<% end %>
</div>
</div>
【例】form_withで書いたフォーム
<div class="contents row">
<div class="container">
<%= form_with(model: @tweet, local: true) do |form| %>
<h3>
投稿する
</h3>
<%= form.text_field :name, placeholder: "Nickname" %>
<%= form.text_field :image, placeholder: "Image Url" %>
<%= form.text_area :text, placeholder: "text", rows: "10" %>
<%= form.submit "SEND" %>
<% end %>
</div>
</div>
上記は双方とも、コントローラーで@tweetを定義していると仮定します
ご覧の通り、大きく違いはありません。
正確には、form_withは、form_forとform_tagの機能を組み合わせたものです。しかしながら、学習中の現段階では「form_forと同じように使える」と把握するだけでも良いでしょう。
local: true オプション
form_withでは、デフォルトの状態ではremote: trueというajaxでの通信が行われる設定になっています。現状ではこのajax通信は必要のない機能です。それをキャンセルするためにlocal: trueというオプションを付与する必要があります。local: trueオプションを付与すれば、これまで学んできたRailsのフォームと同様に使用することが出来ます。