今回は、フォームを実装する際に使用する「form_with」というヘルパーメソッドについて簡単に解説したいと思います。Railsでフォームを実装する際、「form_with」の知識はマストになってくるので、ぜひこの機会に理解を深めていきましょう。
form_withとは
Rails 5.1というバージョンから推奨されている、フォーム実装のためのヘルパーメソッドです。それ以前までは、「form_tag」と「form_for」が推奨されていましたが、Rails 5.1以降から、それらの使用は推奨されていません。
form_tagとform_forについて
「form_with」を使いこなす上で、以前までのフォーム実装をするためのヘルパーメソッド「form_tag」と「form_for」について理解しておかなければなりません。
「form_tag」と「form_for」を順番に見ていきましょう。
form_tag
ビューでHTMLを用いて、以下のようにフォームを作ったと仮定します。
<div>
<form action="/test" method="post">
<input type="text" id="name">
<input type="submit">
</form>
</div>
HTMLのformタグを使うには、action属性とmethod属性の指定をしなければなりません。
action属性とはフォームの送信ボタンを押した時の送信先です。つまり送信先のURI(URL)を記載します。
method属性とは送信時の送信方法です。get(サーバーからデータを取得)もしくはpost(ユーザーのデータ送信)を指定します。
しかし、Railsではセキュリティの観点から、HTMLのformタグだけで作成したフォームを使用することは推奨されていません。
そこでヘルパーメソッドである「form_tag」を使用すると、以下のように書き直すことができます。
<div>
<%= form_tag('/test', method: :post) do %>
<input type="text" id="name">
<input type="submit">
<% end %>
</div>
form_for
「form_for」の基本的な書き方は以下の通りです。
<%= form_for('モデルクラスのインスタンス') do |f| %>
フォーム内容
<% end %>
モデルクラスのインスタンスとは、保存したいテーブルのクラスのインスタンスです。
例えば、usersテーブルに新たにレコードを作成したい場合、コントローラに以下のように記述します。この@userが、保存したいテーブルのクラスのインスタンスになります。
def new
@user = User.new
end
実際に「form_for」を用いて実装してみると、以下のようになります。
<%= form_for(@user) do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
form_for内で使うメソッドは、「f.htmlタグ名 :カラム名」の形で指定します。htmlタグ名は数が多いので全て覚える必要はなく、使う場面になったらその都度調べていきましょう。
念の為、よく使うhtmlタグを以下に羅列しておきます。
- f.label
- f.text_field
- f.date_select
- f.check_box
- f.number_field
- f.submit
ここでさらに1つ注意点があります。
「form_tag」では、action属性を使うことで送信先を決めていました。では、「form_for」はどのようにして送信先を決めているのでしょうか。
「form_for」では、コントローラーで作成したインスタンスがnewメソッドで新たに作成され、何も情報を持っていなければ自動的にcreateアクションへ、editアクションなどで作成され、すでに情報を持っている場合はupdateアクションへ自動的に振り分けてくれるという性質があります。
# 新規作成したレコードなのでcreateアクションが動くパターン
def new
@user = User.new
end
# 既存のレコードを取得しているのでupdateアクションが動くパターン
def edit
@user = User.find(params[:id])
end
使い分け
「form_for」と「form_tag」どちらを使うべきかは、モデルの有無で判断します。
入力フォームで入力するデータのモデルがあれば「form_for」、入力するデータが特にモデルを持っていなければ「form_tag」を使用します。実際の使用例で言うと、「form_for」は投稿フォームの際に使用し、「form_tag」は検索フォームの際に使用します。
form_withの書き方
では本題の「form_with」について見ていきましょう。「form_with」では「form_tag」と「form_for」の使い方を併用することができます。
それぞれ見ていきます。
form_tagのような使い方
<%= form_with url: users_path do |form| %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
form_tagの特徴としては、urlを指定しています。
form_forのような使い方
<%= form_with model: @user do |form| %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
form_forの特徴としては、modelを指定しています。
form_withの特徴
最後に「form_with」の特徴を挙げると、以下の3つになります。
- 自動でパスを選択してくれ、HTTPメソッドを指定する必要が無いこと
- コントローラーから渡された、ActiveRecordを継承するモデルのインスタンスが利用できること
- inputタグを用いないこと
今回は、フォームを実装する際に使用する「form_with」というヘルパーメソッドについて簡単に解説しました。「form_with」の使用頻度は今後もどんどん増えてくるので、この機会にしっかりマスターしていきましょう。