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

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

複数間のモデルで同じ条件で検証したい属性がある時など、カスタムバリデータを作成することで同じロジックを各モデルに実装する必要がなくなる。

実装手順

  • まず、app/validatorsディレクトリを作成する。その後、validator.rbを作成。

今回は1つの属性を検証する場合で実装。 1つの属性を検証したい時はEachValidatorを使用する。EachValidatorを利用するには、ActiveModel::EachValidatorを継承したクラスを作成する。そしてこのバリデータクラスは必ず validate_each メソッドを実装。validate_eachメソッドは次の3つの引数を受け取る。

#例
class AttachmentValidator < ActiveModel::EachValidator
  include ActiveSupport::NumberHelper

  def validate_each(record, attribute, value)
    return if value.blank? || !value.attached?

    has_error = false

    if options[:maximum]
      if value.is_a?(ActiveStorage::Attached::Many)
        value.each do |one_value|
          unless validate_maximum(record, attribute, one_value)
            has_error = true
            break
          end
        end
      else
        has_error = true unless validate_maximum(record, attribute, value)
      end
    end

    if options[:content_type]
      if value.is_a?(ActiveStorage::Attached::Many)
        value.each do |one_value|
          unless validate_maximum(record, attribute, one_value)
            hass_error = true
            break
          end
        end
      else
        has_error = true unless validate_content_type(record, attribute, value)
      end
    end

    record.send(attribute).purge if options[:purge] && has_error
  end

※バリデータクラスにoptions[オプション]として渡される。 ※ActiveStorage :: Attached :: Many モデルへの複数の添付ファイルを表す装飾されたプロキシオブジェクト。

このカスタムバリデータはモデル内でvalidatesメソッドで呼び出すことができる

class Site < ApplicationRecord
 
  validates :attachment, attachment: true
end

参考サイト

edgeapi.rubyonrails.org

qiita.com

railsguides.jp

zenn.dev