0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

form_for,form_with,form_tag??ヘルパーメソッドの使い分け

Last updated at Posted at 2020-04-04

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のフォームと同様に使用することが出来ます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?