【Rails】form_forの使い方を徹底解説!

Rails

form_forとは

railsで情報を送信するためのヘルパーメソッドです。
form_forを使うことにより、簡単に入力フォームに必要なHTMLを作成することができます。
主にテーブルにレコードを新規作成、更新するときに利用します。

form系ヘルパーメソッドの使い分け

railsで投稿フォームを作成するにはセキュリティの面から直接inputタグを利用して書くことはありません。
投稿フォームを作成するにはform_tagやform_for、form_withといったヘルパーメソッドを使用します。

投稿フォームに投稿された内容を保存するテーブルが存在するときにはform_forを使います。
それに対し検索フォームのようなフォームは検索ワードを入力してもらうだけでそのワードはデータベースに保存する必要はないですよね?
そういう場合のフォームはform_tagで作成します。

form_withはrails5から使えるようになったヘルパーメソッドで、保存する内容がない場合でもform_forと同じようなコードで書くことができます。
rails5.1からはform_withを使うことが推奨されています。

form_forの使い方

ではform_forは実際どのように書くのかを見ていきましょう。

erb
1
2
3
<%= form_for('モデルクラスのインスタンス') do |f| %>
  フォーム内容
<% end %>

実際の例は下記のようになります。

erb
1
2
3
4
<%= form_for(@user) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

上のコードはコンパイルされると下記のコードになります。

html
1
2
3
4
5
6
<form class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
  <input name="utf8" type="hidden" value="✓" />
  <input type="hidden" name="authenticity_token" value="※ここにはトークンが入ります" />
  <input type="text" name="user[text]" id="user_text" />
  <input type="submit" name="commit" value="Create User" />
</form>

このようにform_forでフォームを作成すると、文字コードや不正な情報が投稿されないようトークンも自動で作成されます。
コードが非常に短くかけますし、セキュリティも高まるのでrailsでフォームを作成する際はform系のヘルパーメソッドを使って作成します。

form_forの引数

form_forの引数にはモデルクラスのインスタンスを指定します。
※()は省略可能です。
モデルクラスのインスタンスとは保存したいテーブルのクラスのインスタンスのことです。
今回はusersテーブルに新たにレコードを作成したいので、コントローラー側で下記のように記述します。

ruby
1
2
3
def new
  @user = User.new
end

この「@user」をform_forの引数に指定するわけです。

form_tagでは送信先に当たるパスを引数で設定しましたが、form_forでは記述がないことがわかります。
ではform_forではどのように送信先を決めているのでしょうか?
コントローラーで作成したインスタンスがnewメソッドで新たに作成されて何も情報を持っていなければ自動的にcreateアクションへ、findメソッドなどで作成され、すでに情報を持っている場合はupdateアクションへ自動的に振り分けてくれます。

ruby
1
2
3
4
5
6
7
8
9
def new
  @user = User.new
end
# 新規に作成したレコードなのでcreateアクションが動く

def edit
  @user = User.find(params[:id])
end
# 既存のレコードを取得しているのでupdateアクションが動く

なのでform_tagのようにパスとhttpメソッドを指定しなくても自動で振り分けてくれるというわけです。
非常に便利ですね!

アクション名で記述してみよう

form_forはパスとhttpメソッドで次に動かすアクションを指定しなくても良いと書きましたが、ルーティングがうまくいかない時などは直接コントローラー名とアクション名を指定することもできます。

erb
1
2
3
4
<%= form_for(@user, url: {controller: 'users', action: 'index' }) do %>
  <input type="text" id="name">
  <input type="submit">
<% end %>

form_tagとのparamsの構造の違い

form_tagで作成されたフォームのパラメータはparamsを使えば取り出すことができました。

shell
1
2
3
# 例:form_tagの場合
params
=> {"name"=>"テスト太郎"}

ですがform_forで作成した場合は下記のようになります。

shell
1
2
3
# 例:form_forの場合
 params
=> {"user"=>{"name"=>"テスト太郎" }}

このようにハッシュの中にハッシュが入っているのが確認できます。
ですのでストロングパラメーターを作成する際にはrequireメソッドを使う必要があります。

shell
1
2
3
params.require(:user)
# 下記の内容が取得できる
{"name"=>"テスト太郎" }

form_forとform_tagではストロングパラメーターを定義するときの記述が異なりますので注意しましょう!

form_forでの各投稿フォームの作り方

form_forで各投稿フォームを作成するときは下記のように記述します。

erb
1
2
3
4
<%= form_for(@user) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

このように「f.htmlタグ名 :カラム名」と指定します。
カラム名は保存される先のテーブルのカラム名を指定します。
つまり上の例だとusersテーブルのnameカラムに投稿した内容が送られることなります。
送信ボタンは「f.submit」とするだけで作成されます。

from_forは最初は記述が難しそうに感じますが、実は非常にシンプルに記述ができます。

form_forで使用できるhtmlタグ

form_forで使用できるhtmlタグ名には下記のような種類があります。

メソッド 用途
f.text_field 一行のテキスト投稿フォーム
f.text_area 複数行のテキスト投稿フォーム
f.number_field 数値入力ボックスを生成
f.email_field メールアドレス入力ボックスを生成
f.check_box チェックボックスを生成
f.collection_select データベースの情報を元に選択肢を生成
f.file_field ファイル選択ボックスを生成
f.datetime_field 日時の入力欄を生成
f.date_select 日付選択ボックスを生成
f.submit 送信ボタンの生成

それでは個々の具体的な書き方を見てみましょう。

f.text_field

一行のテキスト投稿フォームを作成します。

text_filed
オプションとして下記の項目を設定できます。

メソッド 用途
class cssのクラスの指定
size フォームの幅を指定
maxlength 入力可能な最大文字数の指定
erb
1
<%= f.text_field :name, class: "hoge", size: 30 %>

このように指定すると「hoge」というcssのhogeというクラスが指定され、幅が30文字になります。
ちなみに設定しないときの初期値は20になります。

f.text_area

複数行のテキスト投稿フォームを作成します。

text_area
オプションとして下記の項目を設定できます。

メソッド 用途
class cssのクラスの指定
size フォームの幅を指定
maxlength 入力可能な最大文字数の指定
erb
1
<%= f.text_area :name, class: "hoge", size: "30x10" %>

このように指定すると「hoge」というcssのhogeというクラスが指定され、幅が30文字の行が10行表示されます。
ちなみに設定しないときの初期値は40x20になります。(※「x」はXの小文字)

f.number_field

数字を増減させるためのボタンが利用できるフォームを作成します。
直接フォームに数字を入力することもできますが、数値以外は入力できません。

number_field

メソッド 用途
class cssのクラスの指定
size フォームの幅を指定
max 最大値の設定
min 最小値の設定
erb
1
<%= f.number_field :age, class: "hoge", min: 0, max: 1 %>

このように指定すると「hoge」というcssのクラスが指定され、最小値0、最大値が1の状態で投稿してもらうことができます。

f.email_field

メールアドレスを入力してもらうフォームを作成します。
投稿内容に「@」が含まれない時はメールアドレスをみなされずエラーとなります。

email_field

メソッド 用途
class cssのクラスの指定
size フォームの幅を指定

f.check_box

チェックボックスを作成します。

check_box

メソッド 用途
class cssのクラスの指定
size フォームの幅を指定
checked 初期状態をチェック状態にします
erb
1
<%= f.check_box :sex ,{}, "true", "false" %>

このように指定するとチェックされている時はtrueが、されていない時はfalseが送られます。

erb
1
<%= f.check_box :sex ,{checked: true}, "true", "false" %>

このように指定すると初期状態のチェックボックスがチェックされた状態になって表示されます。

f.radio_button

ラジオボタンを作成します。
書き方は下記の通りです。

erb
1
<%= f.radio_button "保存されるカラム名", "カラムに保存される内容" %>

実際の例を見てみましょう。

erb
1
<%= f.radio_button :sex, "男" %><%= f.radio_button :sex, "女" %>

このように記述すると下記のように表示されます。

radio_button

男を選択しているとsexカラムに「男」という文字列が保存されます。
どれか一つしか選択させない場合に使います。
もちろん3つ以上でも記述が可能です。

オプションとして下記の項目が設定できます。

メソッド 用途
class cssのクラスの指定
size フォームの幅を指定
checked trueと指定するとデフォルトでチェックが付いた状態になります

下のように記述すると「女」が初期状態で選択されます。

erb
1
性別:<%= f.radio_button :sex, 0 %><%= f.radio_button :sex, 1, checked: true %>

この場合は「女」を選択するとsexカラムに「1」という数字が保存されます。

f.collection_select

データベースに保存されている情報を元に選択肢を表示させます。
書き方は下記の通りです。

erb
1
<%= f.collection_select(保存されるカラム名, オブジェクトの配列, カラムに保存される項目, 選択肢に表示されるカラム名 ) %>

説明をみてもわかりづらいので実際の例をみてみましょう。
今jobsテーブルのnameカラムに下記のレコードが保存されているとします。

collection_select
この6つのレコードのnameカラムを選択肢として投稿フォームに表示させ、選択した項目のidがusersテーブルのjob_idに保存したい時には下記のように定義します。

まずはusersコントローラーのnewアクションをこのように定義します。

ruby
1
2
3
def new
  @jobs = Job.all
end

これでjobsテーブルから全てのレコードを取得し、@jobsという変数に代入しました。

次にビューの方で下記のように記述します。

erb
1
<%= f.collection_select(:job_id, @jobs, :id, :name ) %>

するとこのように表示されます。

collection_select
@jobsの最初のレコードのnameカラムの値が順番に選択肢として表示されているのが確認できます。

ここで一番上の「プログラマン講師」を選択し、送信するとform_forの引数に渡したインスタンスのテーブルのjob_idというカラムにjobsテーブルのidカラムの数値が保存されます。

collection_selectではこのように引数に記述する順番が大事なので記述する際は気をつけましょう。

f.file_field

ファイルを送信する際のファイル選択ボックスを生成します。

file_field

f.datetime_field

日時の入力欄を作成します。

date_field

f.date_select

日付選択ボックスを生成します。

date_select

f.submit

送信ボタンを作成します。

erb
1
<%= f.submit "ボタンの名前" %>

上のように記述すると下のような送信ボタンが生成されます。

erb
1
<%= f.submit "送信" %>

送信ボタン

実際に投稿フォームを作ってみよう

それでは実際にform_forを使って投稿フォームを作成してみましょう。
下記のコマンドを順に実行してみましょう。
①git clone -b form_for https://github.com/miyagit/programan_dojo.git

② cd programan_dojo

③ bundle install
→ rbenv: version ‘2.4.1’ is not installed と表示された場合は、ruby -v と実行してください。

ruby -vと実行し出てきたversion(例: 2.3.1)と出てきたら、

vim .ruby-versionとし、
ruby -vで出てきた値(例: 2.3.1)に書き換えてください。

続いてvim Gemfileとし、ruby 2.4.1と書いてある部分をruby -vで出てきた値(例: 2.3.1)に書き換えてください。

④ rails db:create && rails db:migrate && rails db:seed

環境構築が完了しました。と表示されると、
本当にrails applicationが動作するかrails sコマンドで起動しましょう。

rails sを起動し、ブラウザでlocalhost: 3000と入力して下記のような画面が出てくれば環境構築完了です!

環境構築

usersテーブルを確認しよう

今回はform_forでuserの新規登録画面を作成します。
その前にusersテーブルの構造を確認しておきましょう。
トップページを開くとusersテーブルにどんなカラムがあるのか確認できます。

今回のデータベース構造は下記のようになっています。

usersテーブル

内容 カラム名
名前 name
職業 job_id
性別 sex
年齢 age
身長 tall
体重 weight

jobsテーブル

内容 カラム名
名前 name

usersコントローラーのnewアクションを定義しよう

今回はform_forで新規登録画面を作成します。
それにはnewアクションを動かすのでまずはnewアクションを定義しましょう。
アクション内ではform_forの引数に渡すインスタンスを作成します。
また、職業の箇所はcollection_selectで選択肢を表示したいので、上の記事をよく読みcollection_selectに渡すインスタンスを生成してみましょう。

下記のようにusersコントローラーのnewアクションが定義されていれば大丈夫です。

ruby
1
2
3
4
def new
    @user = User.new
    @jobs = Job.all
end

投稿フォームを作成しよう

次にnew.html.erbにform_forを使って投稿フォームを作成しましょう。
使用するhtmlタグは下記の通りとします。

内容 カラム名
name text_field
job collection_select
sex number_field
age number_field
tall number_field
weight number_field

一番下には送信ボタンを作成する「f.submit」も書いておきましょう。
下記のように書かれていればうまく投稿フォームが作成されているはずです。

erb
1
2
3
4
5
6
7
8
9
10
11
<div class='content'>
    <%= form_for @user do |f| %>
    <%= f.text_field :name %>
    <%= f.collection_select :job_id, @jobs, :id, :name %>
    <%= f.number_field :sex %>
    <%= f.number_field :age %>
    <%= f.number_field :tall %>
    <%= f.number_field :weight %>
    <%= f.submit "送信" %>
    <% end %>
</div>

下記のアドレスを入力し、投稿画面を確認してみましょう。
http://localhost:3000/users/new

すると下記のような画面が確認できるはずです。

submit

form_forは表示される際、inputタグに変換されるため全て横並びになってしまいます。
これでは見にくいので
タグで改行をいれましょう。

erb
1
2
3
4
5
6
7
8
9
10
11
<div class='content'>
    <%= form_for @user do |f| %>
    <%= f.text_field :name %><br>
    <%= f.collection_select :job_id, @jobs, :id, :name %><br>
    <%= f.number_field :sex %><br>
    <%= f.number_field :age %><br>
    <%= f.number_field :tall %><br>
    <%= f.number_field :weight %><br>
    <%= f.submit "送信" %>
    <% end %>
</div>

するとこのようになりました。

input

ちゃんと縦に並び、みやすくなりましたね!

ここで1回ソースを確認し、form_forがrailsによってどのようにhtmlにコンパイルされたか確認してみましょう。
ダブルクリックをし、「ページのソースを表示」を選びましょう。
すると下記のコードに変換されているのが確認できます。

html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<form class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
  <input name="utf8" type="hidden" value="✓" />
  <input type="hidden" name="authenticity_token" value="eShsYZ2AAknx2Ik2bIGVduAKQRIDwWtMpcuIgoQq3HwhAxLxhg02d3QAFTvTaW+OzaPajFLzsu4aH512aoTfQw==" />
  <input type="text" value="" name="user[name]" id="user_name" />
  <select name="user[job_id]" id="user_job_id">
  <option value="1">プログラマン講師</option>
  <option value="2">家電メーカー</option>
  <option value="3">主婦</option>
  <option value="4">保育士</option>
  <option value="5">学生</option>
  <option value="6">営業</option>
  </select>
  <input type="number" name="user[sex]" id="user_sex" />
  <input type="number" name="user[age]" id="user_age" />
  <input type="number" name="user[tall]" id="user_tall" />
  <input type="number" name="user[weight]" id="user_weight" />
  <input type="submit" name="commit" value="送信" data-disable-with="送信" />
</form>

このようformに変換されていますね。
ちゃんとcreateアクションが動くようにhttpメソッドも自動的にpostになっています。
inputタグの中のnameで指定している部分が入力されたデータが保存されるカラムになっています。

今回user[カラム名]としてあげることにより保存されるカラムを指定できます。
なぜname="カラム名"で指定できないのかはこのあと説明します。

さて、これでフォームはできましたが、このままだとどのフォームに何を入力していいかわかりませんね。
その時はlabelを使用します。

label

labelタグを作成します。
今回のnameカラムのフォームにラベルをつける時は下記のように記述します。

erb
1
2
<%= f.label :name %>
<%= f.text_field :name %>

label
このようにラベルがつきました。
今回はカラム名と同じになりましたが、自由に設定することもできます。
それには下記のように記述をします。

erb
1
2
<%= f.label :name, "名前:" %>
<%= f.text_field :name %>

label
こちらの方がわかりやすいですね!
同じように全てのフォームにラベルをつけてみましょう。

erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div class='content'>
    <%= form_for @user do |f| %>
        <%= f.label :name, "名前:" %>
        <%= f.text_field :name %><br>
        <%= f.label :job_id, "職業:" %>
        <%= f.collection_select :job_id, @jobs, :id, :name %><br>
        <%= f.label :sex, "性別:" %>
        <%= f.number_field :sex %><br>
        <%= f.label :age, "年齢:" %>
        <%= f.number_field :age %><br>
        <%= f.label :tall, "身長:" %>
        <%= f.number_field :tall %><br>
        <%= f.label :weight, "体重:" %>
        <%= f.number_field :weight %><br>
        <%= f.submit "送信" %>
    <% end %>
</div>

これでだいぶわかりやすい投稿フォームになりました。

form
ソースを確認してみましょう。

html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
  <input name="utf8" type="hidden" value="✓" />
  <input type="hidden" name="authenticity_token" value="nH1so7B0iPzSjGR7Gm8/lWH9q4bNDamGw1ej5560IYjEVhIzq/m8wldU+Halh8VtTFQwGJw/cCR8g7YTcBoitw==" />
        <label for="user_name">名前:</label>
        <input type="text" value="" name="user[name]" id="user_name" /><br>
        <label for="user_job_id">職業:</label>
        <select name="user[job_id]" id="user_job_id">
          <option value="1">プログラマン講師</option>
          <option value="2">家電メーカー</option>
          <option value="3">主婦</option>
          <option value="4">保育士</option>
          <option value="5">学生</option>
          <option value="6">営業</option></select><br>
        <label for="user_sex">性別:</label>
        <input type="number" name="user[sex]" id="user_sex" /><br>
        <label for="user_age">年齢:</label>
        <input type="number" name="user[age]" id="user_age" /><br>
        <label for="user_tall">身長:</label>
        <input type="number" name="user[tall]" id="user_tall" /><br>
        <label for="user_weight">体重:</label>
        <input type="number" name="user[weight]" id="user_weight" /><br>
        <input type="submit" name="commit" value="送信" data-disable-with="送信" />
</form>

このようにlabelタグにコンパイルされているのが確認できます。
labelタグはforで指定した文字とinputタグの中で指定したidを同じにするとフォーム部品と項目名を関連づけることができます。
f.labelとするだけでそれが上のように自動でコンパイルされます。

それでは実際に投稿した時にデータベースに保存されるよう、usersコントローラーにcreateアクションを定義してみましょう。
createメソッドを使用する時はストロングパラメーターを設定する必要があります。
下記のようにcreateアクション、およびストロングパラメーターの記述をしましょう。

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class UsersController < ApplicationController
    def new
        @user = User.new
        @jobs = Job.all
    end

    def create
        User.create(user_params)
        redirect_to root_path
    end

    private
    def user_params
        params.require(:user).permit(:name, :job_id, :sex, :age, :tall, :weight)
    end
end

どうしてこのように記述するかはこのあと説明します。

form_forでの保存方法の注意点

form_tagで投稿フォームを作成した時に指定するストロングパラメーターは上の例だと下記のような記述でした。

ruby
1
params.permit(:name, :job_id, :sex, :age, :tall, :weight)

しかし上の例をみてもわかる通りform_forを使った時は下記のように記述します。

ruby
1
params.require(:user).permit(:name, :job_id, :sex, :age, :tall, :weight)

form_tagだと「params.permit(:キー名)」でしたが、form_forだと「params.require(:モデル名).permit(:カラム名)」になります。
これはなぜでしょう?

これは2つのparamsの構造が違うためです。
binding.pryを使い、paramsの中身を確認してみましょう。
Gemfileの一番下に下記のコードを追記してください。

ruby
1
gem 'pry-rails'

その後、ターミナルで「bundle install」コマンドを実行してください。

users_controllerのcreateアクションを下記のように編集してください。

ruby
1
2
3
4
5
def create
  User.create(user_params)
    binding.pry
    redirect_to root_path
end

次に下記のアドレスから投稿画面にいき、テスト投稿をしてみましょう。

http://localhost:3000/users/new

すると送信後、トップページへ遷移せずに現在の画面にとどまり続けるはずです。
この状態でサーバーを起動したターミナルを確認してみましょう。

params
このようにコマンド入力待ちの状態になっているので、「pramas」と入力してください。
するとparamsの中身が表示されるので、確認をしてみましょう。

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[1] pry(#<UsersController>)> params
=> <ActionController::Parameters 
{
  "utf8"=>"✓",  "authenticity_token"=>"P9L/zj5tIU3+L3cUv7kvFRbX34RET0rwbMymMf8/9P6shtNnJ8UejzDmax2t59nG6gdhnYBzA7n3JspBE/UuvQ==",
  "user"=><ActionController::Parameters 
  {
    "name"=>"テスト太郎",
    "job_id"=>"1",
    "sex"=>"0",
    "age"=>"60",
    "tall"=>"155",
    "weight"=>"50"
  }permitted: false>,
  "commit"=>"送信",
  "controller"=>"users",
  "action"=>"create"
    } permitted: false>

上のような結果が返ってきました。
(※確認後はexitコマンドでコンソールモードから抜けましょう。)
もし今回の投稿フォームをform_tagを使用して作成した時のparamsは下記のようになります。

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
[1] pry(#<UsersController>)> params
=> <ActionController::Parameters {
  "utf8"=>"✓", "authenticity_token"=>"SAf1Hfm/9XLsmT+PlH7auww2dNicdQ9lmx9qkjWzBJ7bU9m04BfKsCJQI4aGICxo8ObKwVhJRiwA9Qbi2Xne3Q==",
  "name"=>"テスト二郎",
  "job_id"=>"1",
  "sex"=>"0",
  "age"=>"50",
  "tall"=>"155",
  "weight"=>"50",
  "commit"=>"送信",
  "controller"=>"users",
  "action"=>"create"
} permitted: false>

この2つの違いはparamsの構造です。
form_forの方はハッシュの中にハッシュが入っているのが確認できると思います。
userというキーのバリューがハッシュになっているためです。
なのでparamsからキーがnameのバリューを取り出す場合には「params[:user][:name]」のように記述する必要があります。

コンパイルされたinputタグの中で「name="user[カラム名]"」となっていたのはこのためです。
ですのでcreateアクションでフォームに投稿された内容をデータベースに保存する記述は下記のようになります。データベースに保存する記述は下記のようになります。

ruby
1
2
3
def create
  User.create(name: params[:user][:name], job_id: params[:user][:job_id], sex: params[:user][:sex], age: params[:user][:age], tall: params[:user][:tall], weight[:user][:tall])
end

この記述だと非常に長くなってしまいますね。
そこで登場するのがrequireメソッドです。
requireメソッドをparamsに対して使うとparamsの中から引数に指定したハッシュが取り出せます。

もう一度binding.pryを使ってrequireメソッドを確認してみましょう。

下記のアドレスから投稿画面にいき、テスト投稿をしてみましょう。

http://localhost:3000/users/new

その後、「params.require(:user)」と入力してください。
すると下記のハッシュが返ってくるのが確認できます。

shell
1
2
3
4
5
6
7
8
9
[1] pry(#<UsersController>)> params.require(:user)
=> <ActionController::Parameters {
  "name"=>"テスト太郎",
    "job_id"=>"1",
    "sex"=>"0",
    "age"=>"50",
    "tall"=>"160",
    "weight"=>"55"
    } permitted: false>

このようにparamsの中から引数に指定したuserの値が取り出せたことが確認できますね!
そのあとに続けるpermitメソッドはこのハッシュの中からデータベースに保存したいキーを指定することができます。
このメソッドによって悪意のあるリクエストが送られてきてもpermitメソッドで指定したキーしか保存されないのでセキュリティが高まります。
この2つのメソッドを利用することでcreateアクションは下記のようにかなり簡潔にかけますね!

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# requireメソッドを使わない時
def create
  User.create(name: params[:user][:name], job_id: params[:user][:job_id], sex: params[:user][:sex], age: params[:user][:age], tall: params[:user][:tall], weight[:user][:tall])
end

# ストロングパラメーターでrequireメソッドとpermitメソッドを使用した時
def create
    User.create(user_params)
end

private
def user_params
    params.require(:user).permit(:name, :job_id, :sex, :age, :tall, :weight)
end

自分で投稿フォームを編集してみよう

今作成した投稿フォームのhtmlタグを他のものに変えた時にどういう表示になるのか、また性別は0か1なので0から1までしか入力できないようにオプション指定をしてみたりと自分で色々と編集を加えてみましょう。

まとめ

form_forは今回のように投稿フォームが保存されるテーブルがある時に使い、検索フォームなどフォームから送信されたデータが保存されるテーブルがない場合はform_tagを使用すると覚えておきましょう!