【23】【Rails】バリデーションチェックリスト

この記事は基本的なバリデーションを漏れなく実装したい際に、手助けとなる記事です。
本来はシステムの要件からバリデーションを考えると思います。
しかし、プログラミング初学者は異常処理の知見が乏しい。不具合に対する知識が圧倒的に足りません。
よって、Railsガイドのバリデーションを全て見て、railsガイドから基本的なバリデーションの要件をチェックしたいと思います。

チェックリスト

フォームが送信されたときにユーザーインターフェイス上のチェックボックスがオンになっているか?

事例:サービス利用条項など、何らかの文章を確認したかのチェックしたいバリデーションヘルパー
acceptance

class Person < ApplicationRecord
 validates :terms_of_service, acceptance: true
end

テキストフィードで受け取る内容が完全に一致しているか?

事例:メールアドレスやパスワードの確認フィールド
バリデーションヘルパー
confirmation

class Person < ApplicationRecord
 validates :email, confirmation: true
end

<%= text_field :person, :email %>
<%= text_field :person, :email_confirmation %>

カラムに特定の値が含まれないようにしたい。

バリデーションヘルパー
exclusion

class Account < ApplicationRecord
 validates :subdomain, exclusion: { in: %w(www us ca jp),
   message: "%{value}は予約済みです" }
end

与えられた集合に属性の値が含まれているかどうかを検証する

事例:リストの選択、都道府県リスト、性別のリスト、大きさのリスト
バリデーションヘルパー
inclusion

class Coffee < ApplicationRecord
 validates :size, inclusion: { in: %w(small medium large),
message: "%{value} のサイズは無効です" }
end

正規表現と属性の値がマッチするかどうか検証をする

事例:
フリガナ、数字の入力欄、email
バリデーションヘルパー
format

class Product < ApplicationRecord
 validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/,
   message: "英文字のみが使えます" }
end

文字数の最小値、最大値を設定する

事例:
フリガナ、数字の入力欄、email
名前欄で長さが1000万文字の名前を入力できないようにする。
(いたずらで簡単にできて、かつ効果的にぶっ壊れてしまうので必ず設定すること!)
バリデーションヘルパー
length

class Person < ApplicationRecord
 validates :name, length: { minimum: 2 }
 validates :bio, length: { maximum: 500 }
 validates :password, length: { in: 6..20 }
 validates :registration_number, length: { is: 6 }
end
考慮すべきオプション
minimum 属性はこの値より小さな値を設定できない。
maximum 属性はこの値より大きな値を設定できない。
in 属性の長さは、与えられた区間以内でなければならない。
within このオプションの値は範囲でなければならない。
:is: 属性の長さは与えられた値と等しくなければならない。

属性に数値のみが使われるようにする

事例:
数字の入力欄
金額の入力でひらがなや小数を受付ないようにしたい。
バリデーションヘルパー
numericality

class Player < ApplicationRecord
 validates :points, numericality: true
 validates :games_played, numericality: { only_integer: true }
end
検討すべきオプション
greater_than 指定された値よりも大きくなければならない。
デフォルトのエラーメッセージは「must be greater than %{count}」。
:greater_than_or_equal_to 指定された値と等しいか、それよりも大きくなければならない。
デフォルトのエラーメッセージは「must be greater than or equal to %{count}」。
equal_to  指定された値と等しくなければならない。
デフォルトのエラーメッセージは「must be equal to %{count}」。
less_than  指定された値よりも小さくなければならない。
デフォルトのエラーメッセージは「must be less than %{count}」。
less_than_or_equal_to  指定された値と等しいか、それよりも小さくなければならない。
デフォルトのエラーメッセージは「must be less than or equal to %{count}」。

指定された属性が「空でない」ことを確認する

事例:
emailなどの必須項目
バリデーションヘルパー
presence

class Person < ApplicationRecord
 validates :name, :login, :email, presence: true
end

オブジェクトが保存される直前に、属性の値が一意(unique)であり重複していない

事例:
email
注意
データベース側にも一意性インデックスをつけるように。
このヘルパーは一意性の制約をデータベース自体には作成しないので、本来一意にすべきカラムに、たまたま2つのデータベース接続によって同じ値を持つレコードが2つ作成される可能性が残ります。これを避けるには、データベースのそのカラムに一意インデックスを作成する必要があります

バリデーションヘルパー
uniqueness

class Account < ApplicationRecord
 validates :email, uniqueness: true
end
検討すべきオプション
scope 一意性チェックの範囲を限定する別の属性を指定する

以上です。
ここまでのバリデーションだけでもだいぶカバーできると思います。

システム要件に応じて、ifオプション、onオプション、:allow_blankオプションを使う場面もあると思いますが、割愛します。
その他のバリデーションやオプションはRailsガイドを参照して下さい。

参考文献

Railsガイド_

 最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)

現在、株式会社grabssに行くために最後の悪あがきをしています!!
現在の進行状況
この記事は23件目の投稿。目標まで後27件。

よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。


いいなと思ったら応援しよう!