🐸

【Rails】form_forとform_with

2023/11/15に公開

今更ではありますが、基礎の時に「form_forはRails5.1以降では非推奨になり、form_withが推奨されています。」というのをカリキュラムで見かけて当時は課題に追われ直す余裕がなく特に気にしていなかったですが、どのような違いがあるのか気なりここで復習できればと思います。

form_forとform_withの違い

form_forとは

form_forは主にRails 5以前で使われているメソッドで、下記のように書きます。

<%= form_for @model do |f| %>
  <%= f.text_field :attribute %>
  <%= f.submit "Submit" %>
<% end %>

上記では、@modelというインスタンス変数に基づいてモデルの属性を取得し、その属性を表示するフォームを作成します。
deviseによって生成されたviewファイルで使用されているデフォルトのフォームヘルパーはform_forになります。

form_withとは

form_withはRails 5以降で導入された新しいビューヘルパーメソッドで、下記のように書きます。

<%= form_with model: @model do |f| %>
  <%= f.text_field :attribute %>
  <%= f.submit "Submit" %>
<% end %>

form_withでは、modelオプションを使用してモデルのインスタンスを指定することで、モデルに基づいてフォームを作成します。また、form_withはAJAXに対応しており、デフォルトでリモートフォームとして作成されます。

リモートフォームとは

AJAXを使用して非同期でフォームの送信を行うことを指します。

通常のフォームの送信では、フォームのデータがサーバーに送信され、サーバー側で処理が行われた後、レスポンスが返されます。これに対して、リモートフォームでは、フォームのデータが非同期的にサーバーに送信され、サーバー側での処理が行われる間もページのリロードや遷移が行われず、ユーザーはページの操作を継続することができます。

例えば、フォームの送信をクリックした場合、エラーがあった場合でも、リモートフォームを使っていれば、画面全体がリロードされることなく、エラーメッセージの表示やフォームの更新が可能となります。

まとめ

  • form_forは古いバージョンのRailsで使用されるメソッドであり、form_withは新しいバージョンのRailsで推奨されるメソッドです。
  • form_forは、インスタンス変数を使用してモデルの属性を取得し、フォームを作成します。
  • form_withは、デフォルトでAJAXに対応しており、リモートフォームとして作成されます。

感想

ざっくりとform_forはdeviseでデフォルトで作成されるフォームメソッドで、エラーはないけど古いからform_withのほうがいいよ~くらいの認識しかなかったですが、調べてみるとform_withはAJAXに対応していて非同期通信ができるなど、変えたほうが良い理由が理解できてきました。
勉強を始めて3か月目で最初より理解できることが増えてきたので、深堀の足りていなかったことを隙間時間で見つけて学べるようにしていこうと思いました!

Discussion