概要
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 {} |