0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rails カスタムバリデータについて

Posted at

はじめに

  • バリデーションの理解を深める目的で、注文フォームについて学習中
  • 出てきた記述がわからず、「カスタムバリデータ」について調べたため、理解を深めるための記録
  • 学習の備忘録です

学習している教材

バリデーションを追加しよう
Udemyの教材です。とてもわかりやすいです。

参考

前提条件

  • Orderモデルがある

カスタムバリデータ

カスタムバリデータとは、好みのバリデータやバリデーションメソッドを作成して使えるようにすること。
ここでは、複数のクラスで使用できるメールアドレスのバリデータを作成。
まず、app/validatorsフォルダを作成し、さらに以下のファイルを作成する。

email_format_validator.rb
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, "メールアドレスの形式が正しくありません")

あとは、モデルで呼び出す。

order.rb
  validates :email, presence: true, email_format: true

カスタムバリデーターのクラス名を「EmailFormatValidator」としたため、「email_format」で呼び出せる!
これで、汎用性のあるメールアドレスのバリデータが完成!

まとめ

  • ビルトインのバリデーションヘルパー以外にも、好みのバリデータの作成が可能
  • バリデーターを使いこなすには、正規表現の理解を深める必要があると言える

⚠️学習4ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?