概要
Railsのバリデーションには入力の整合性チェックの機能があり、以下のような2つの入力フィールドの内容が同じかどうかをチェックする。
手順
設定
SimpleUserモデルのname属性に対してフォーム入力する- フォームでは
nameの入力欄と再確認用の入力欄の2つを表示する - フォーム送信後、2つの入力欄の値が等しいかどうかをバリデーションで確認する
ルーティング
simple_usersコントローラーのconfirm_nameアクションで入力フォームを表示- フォームからのPOSTを
confirm_name_processアクションで受け取って処理
|
1 2 3 4 5 6 |
Rails.application.routes.draw do ..... get 'simple_users/confirm_name', as: 'confirm_name' post 'simple_users/confirm_name_process', as: 'confirm_name_process' ..... end |
|
1 2 |
confirm_name GET /simple_users/confirm_name(.:format) simple_users#confirm_name confirm_name_process POST /simple_users/confirm_name_process(.:format) simple_users#confirm_name_process |
モデルの生成
:name属性1つだけを持つSimpleUserモデルを構成する
|
1 2 3 4 5 6 7 8 9 |
class CreateSimpleUsers < ActiveRecord::Migration[5.1] def change create_table :simple_users do |t| t.string :name t.timestamps end end end |
マイグレート後
|
1 2 3 4 5 6 7 8 9 10 |
mysql> DESCRIBE simple_users; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+--------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) |
ビュー
入力フィールドと確認フィールドを準備する。確認フィールドは入力フィールドの名前に_confirmationポストフィックスを付ける(入力フィールドが:nameの場合、:name_confirmation)。
|
1 2 3 4 5 |
<%= form_with(model: @user, url: confirm_name_process_path, local: true) do |f| %> <%= f.text_field(:name, placeholder: "名前を入力") %> <%= f.text_field(:name_confirmation, placeholder: "名前を再入力") %> <%= f.submit("送信") %> <% end %> |
モデル
Userモデルで整合性のみ検証させる。
|
1 2 3 |
class SimpleUser < ApplicationRecord validates(:name, confirmation: true) end |
コントローラー
confirm_nameアクションでSimpleUserインスタンスを準備してフォームを表示し、confirm_name_processでフォームから受け取ったパラメーターの整合性をチェック。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class SimpleUsersController < ApplicationController def confirm_name @user = SimpleUser.new end def confirm_name_process puts "----- in confirm process -----" puts "USER_PARAMS:" p simple_user_params @user = SimpleUser.new(simple_user_params) puts "@USER:" p @user puts "@USER.VALID?" p @user.valid? puts "ERRORS.MESSAGES" p @user.errors.messages redirect_to confirm_name_path and return end private def simple_user_params params.require(:simple_user).permit(:name, :name_confirmation) end end |
実行結果
:nameと:name_confirmationが"aaa"と"aaa"のときは、valid? == trueでエラーメッセージは空。
|
1 2 3 4 5 6 7 8 9 |
----- in confirm process ----- USER_PARAMS: <ActionController::Parameters {"name"=>"aaa", "name_confirmation"=>"aaa"} permitted: true> @USER: #<SimpleUser id: nil, name: "aaa", created_at: nil, updated_at: nil> @USER.VALID? true ERRORS.MESSAGES {} |
"aaa"と"bbb"のときは、valid? == falseでエラーメッセージがセットされる。
|
1 2 3 4 5 6 7 8 9 |
----- in confirm process ----- USER_PARAMS: <ActionController::Parameters {"name"=>"aaa", "name_confirmation"=>"bbb"} permitted: true> @USER: #<SimpleUser id: nil, name: "aaa", created_at: nil, updated_at: nil> @USER.VALID? false ERRORS.MESSAGES {:name_confirmation=>["doesn't match Name"]} |
"aaa"と""のとき(:name_confirmationに入力しないとき)は、valid? == falseでエラーメッセージがセットされる。
|
1 2 3 4 5 6 7 8 9 |
----- in confirm process ----- USER_PARAMS: <ActionController::Parameters {"name"=>"aaa", "name_confirmation"=>""} permitted: true> @USER: #<SimpleUser id: nil, name: "aaa", created_at: nil, updated_at: nil> @USER.VALID? false ERRORS.MESSAGES {:name_confirmation=>["doesn't match Name"]} |
""と""のとき(どちらも入力しないとき)は、valid? == trueでエラーメッセージは空。
|
1 2 3 4 5 6 7 8 9 |
----- in confirm process ----- USER_PARAMS: <ActionController::Parameters {"name"=>"", "name_confirmation"=>""} permitted: true> @USER: #<SimpleUser id: nil, name: "", created_at: nil, updated_at: nil> @USER.VALID? true ERRORS.MESSAGES {} |