Validations
上記の様な会員登録画面があったときユーザーが文字を入力する際に、
入力されるデータが「全角数字であるか」や「数字以外の文字を入力しているか」等の開発者側が確認したいことがある。
Validationsを使用すると、開発者側が確認したいデータの入力形式をユーザが入力する時点で気づかせてくれる。
文字数の検証
class Member < ApplicationRecord
# nameの文字数は、1文字から10文字まで
validates :name,
length: { minimum: 1, maximum: 10 }
end
上記の様に記載することで「氏名」を入力するフォームに関して、
文字数を1〜10文字までというルール設定ができる。
条件付きで検証
「メールマガジンを受け取る」にチェックを入れた場合のみ、emailの入力を必須にする。
class Member < ApplicationRecord
# mail_magazineをチェックしたときは、emailは必須
validates :email,
presence: { if: '!mail_magazine.blank?' }
end
!mail_magazine.blank?
は「mail_magazine」 にチェックが入ったときのみ真(true)、入らない場合は偽(false)になる。
※「!」が付いているので真偽が逆になる。
つまり、チェックボックスにチェックが付いているときは「presence: true」、チェックが付いていないときは「presence: false」となり、「メールマガジンを受け取るチェックを付けた場合は、メールアドレスを必須にする」が検証できる。
カスタムバリデーション
「length」や「presence」の様にActiveModel::Validationsモジュールが標準で用意している検証機能ではなく、
自分で検証機能を作成する方法がある。
# 数字3桁+ハイフン(-)+数字4桁の形式であることを検証するクラス
class PostCodeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors.add(attribute, 'は、数字3桁+ハイフン(-)+数字4桁の形式で入力してください。') unless value =~ /\A[0-9]{3}-[0-9]{4}\z/
end
end
class Member < ApplicationRecord
# post_codeは、数字3桁+ハイフン(-)+数字4桁の形式
validates :post_code,
post_code: true
end
validate_eachメソッド
では「数字3桁+ハイフン(-)+数字4桁」の郵便番号の形式で検証している。
また、ActiveModel::EachValidator
を継承した独自の検証クラスを定義している。
validate_eachメソッド
は「length」や「presence」を指定する代わりに「post_code」で指定することができる。
「post_code」とは、検証クラス名の「PostCode」のうち、先頭の大文字「P」は小文字「p」になり、途中の大文字「C」はアンダースコア+小文字「c」になる決まり。
このメソッドの引数には、上記の情報が渡される。
そこで、valueが「数字3桁+ハイフン(-)+数字4桁」の形式になっていることを、正規表現(/\A[0-9]{3}-[0-9]{4}\z/)を使用して検証する。