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