はじめに
- バリデーションの理解を深める目的で、注文フォームについて学習中
- 出てきた記述がわからず、「カスタムバリデータ」について調べたため、理解を深めるための記録
- 学習の備忘録です
学習している教材
バリデーションを追加しよう
Udemyの教材です。とてもわかりやすいです。
参考
前提条件
- Orderモデルがある
カスタムバリデータ
カスタムバリデータとは、好みのバリデータやバリデーションメソッドを作成して使えるようにすること。
ここでは、複数のクラスで使用できるメールアドレスのバリデータを作成。
まず、app/validatorsフォルダを作成し、さらに以下のファイルを作成する。
class EmailFormatValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
return if /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i.match?(value)
record.errors.add(attribute, "メールアドレスの形式が正しくありません")
end
end
validate_eachメソッドを使い、(record, attribute, value)の3つの引数を設定。
それぞれ、
record・・・ここではOrderモデルのインスタンス
attribute・・・validate設定時の属性名
value・・・検証するべき値
を表している。
正規表現は、まだまだ理解が浅い。
1つずつ調べてみると、意味は以下の通り。
\A: ・・・文字列の先頭
[\w+-.]+: ・・・ @より前の部分を表し、アルファベット、数字、アンダースコア、プラス、ハイフン、ピリオドを含む文字の1つ以上の繰り返しとなる
@: ・・・@を表す
[a-z\d-.]+: ・・・@より後の部分を表し、アルファベット、数字、ハイフン、ピリオドを含む文字の1つ以上の繰り返しとなる
.[a-z]+: ・・・メールアドレスのドメインの末尾部分を表し、ピリオドとアルファベットの1つ以上の繰り返しとなる
\z: 文字列の末尾
/i: 正規表現のフラグ
この正規表現にマッチした値(ここでは「test@example.com」のようなメールアドレス)なら、バリデーションの結果をtrueとして返す。
return if /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i.match?(value)
また、一致しない場合、バリデーションエラーメッセージが追加されるようにする。
record.errors.add(attribute, "メールアドレスの形式が正しくありません")
あとは、モデルで呼び出す。
validates :email, presence: true, email_format: true
カスタムバリデーターのクラス名を「EmailFormatValidator」としたため、「email_format」で呼び出せる!
これで、汎用性のあるメールアドレスのバリデータが完成!
まとめ
- ビルトインのバリデーションヘルパー以外にも、好みのバリデータの作成が可能
- バリデーターを使いこなすには、正規表現の理解を深める必要があると言える
⚠️学習4ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。