26
17

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 カスタムバリデーション(validator, EachValidator)

Last updated at Posted at 2020-08-23

#はじめに
今回はカスタムバリデーションについて、まとめれればと思います。

カスタムバリデーター

モデルとは別で、自分でバリデータやバリデーションメソッドを作成することができます。app/配下にvalidatorsディレクトリ(app/validators)を作成することで、自動で読み込んでくれます。

validator

ActiveModel::Validatorを継承するクラス。このクラスでは、validateメソッドを実装する必要があります。
クラス名に規定はなく、validateメソッドを実装する必要があり、
引数としてrecordを受け取ることができます。
このrecordというのは、バリデーション対象のモデルのインスタンスが入ります。


class UserValidator < ActiveModel::Validator
  def validate(record)
    if record.id.present? && !User.exists?(id: record.id)
      record.errors[:name] << '対象のユーザーはいません'
    end
  end
end

呼び出し方法


class User
  include ActiveModel::Validations
  validates_with UserValidator
end

EachValidator

一つの属性に対してのカスタムバリデータを定義できる。ActiveModel::EachValidatorを継承したクラス。

クラス名は<検証名>Validatorの形式で命名。validate_eachメソッドを実装する必要があります。
validate_eachメソッドは引数として(recordattributevalue)の3つを受け取ります。

この引数の3つは
record モデルインスタンス
attribute 属性名
value 属性値

app/validators/user_name_validator.rb


class UserNameValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
      if value.empty? || value.count < 2
          record.errors[:attribute] << (options[:message] || "2文字以上で入力してください")
      end
  end
end

呼び出し方法


validates :name, user_name: true
26
17
1

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
26
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?