サカナ未遂

プログラミング、筋トレ、子育て

Railsで共通で使用できるバリデーションを作る

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であることを示すことになる。

参考書籍に

独習Ruby on Rails

独習Ruby on Rails

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