Rails

【Rails】フォームを簡単に実装できる「form_with」について分かりやすく解説!

Rails

 

今回は、フォームを実装する際に使用する「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_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_tag」はRuby文なので、<%= %>で囲まれているね。

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」の使用頻度は今後もどんどん増えてくるので、この機会にしっかりマスターしていきましょう。