Railsのモデルに独自のバリデーションを作成する時、以下のように実装する
class User < ApplicationRecord validate :email_check private def email_check # Eメールのバリデーション処理 ..... end end
この場合、Userモデル限定のバリデーションとなる。 特定のオブジェクトに限定されずに共通で使用できるバリデーションを作成するには app/validatorsディレクトリの下に、新しいクラスを作成しvalidate_eachメソッドを実装する。
#app/validators/email_address_validator.rb class EmailAddressValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i record.errors[attribute] << (options[:message] || "はメールアドレスではありません") end end end # 各クラスで使用できる。 class Person < ApplicationRecord validates :email, presence: true, email_address: true end class User < ApplicationRecord validates :email, presence: true, email_address: true end
validate_eachの第一引数recordは、呼び出し側のオブジェクト、第二引数attributeは指定した属性名、第三引数valueは指定した属性の値が入る。
呼び出し側で、email_address: trueとすることで、ValidateクラスがEmailAddressValidatorであることを示すことになる。
参考書籍に

- 作者:小餅 良介
- 発売日: 2019/06/19
- メディア: 単行本(ソフトカバー)