サーチ…


属性の数値の検証

この検証は、数値のみの挿入を制限します。

class Player < ApplicationRecord
  validates :points, numericality: true
  validates :games_played, numericality: { only_integer: true }
end

これ以外に:only_integer 、このヘルパーは、受け入れ可能な値に制約を追加するために次のオプションも受け入れます:

  • :greater_than - 値が指定された値より大きくなければならないことを指定します。このオプションのデフォルトのエラーメッセージは "%{count}より大きい必要があります"です。
  • :greater_than_or_equal_to - 値が指定された値以上でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは、 "%{count}以上でなければなりません"です。
  • :equal_to - 値が指定された値と等しくなければならないことを指定します。このオプションのデフォルトのエラーメッセージは "%{count}と等しくなければなりません"です。
  • :less_than - 値が指定された値より小さくなければならないことを指定します。このオプションのデフォルトのエラーメッセージは "%{count}より小さい必要があります"です。
  • :less_than_or_equal_to - 値が指定された値以下でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは、 "%{count}以下でなければなりません"です。
  • :other_than - 値が指定された値以外でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは "%{count}以外である必要があります"です。
  • :odd - trueに設定されている場合、値は奇数でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは、 "奇数でなければなりません"です。
  • :even - trueに設定されている場合、値は偶数でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは「必ず一致する必要があります」です。

デフォルトでは、数値ではnil値は使用できません。 allow_nil:trueオプションを使用して許可することができます。

属性の一意性を検証する

このヘルパーは、オブジェクトの保存直前に属性の値が一意であることを検証します。

class Account < ApplicationRecord
  validates :email, uniqueness: true
end

一意性検査を制限するために使用される1つ以上の属性を指定するために使用できるa :scopeオプションがあります。

class Holiday < ApplicationRecord
  validates :name, uniqueness: { scope: :year,
    message: "should happen once per year" }
end

一意性制約が大文字と小文字を区別するかどうかを定義するために使用できる:case_sensitiveオプションもあります。このオプションのデフォルトはtrueです。

class Person < ApplicationRecord
  validates :name, uniqueness: { case_sensitive: false }
end

属性の存在の検証

このヘルパーは、指定された属性が空でないことを検証します。

class Person < ApplicationRecord
  validates :name, presence: true
end

Person.create(name: "John").valid? # => true
Person.create(name: nil).valid? # => false

absenceヘルパーを使用して、指定された属性が存在しないことを検証できます。それはpresent?使用してpresent?メソッドを使用して、ゼロまたは空の値をチェックします。

class Person < ApplicationRecord
  validates :name, :login, :email, absence: true
end

注:属性がboolean場合、通常の存在確認は使用できません(属性はfalse値に対して有効ではありません)。これを含めるには、インクルード検証を使用します。

validates :attribute, inclusion: [true, false]

検証のスキップ

検証をスキップする場合は、次のメソッドを使用します。これらのメソッドは、オブジェクトが無効であってもオブジェクトをデータベースに保存します。

  • デクリメント!
  • decrement_counter
  • インクリメント!
  • increment_counter
  • トグル!
  • タッチ
  • update_all
  • update_attribute
  • update_column
  • update_columns
  • update_counters

validateを引数として渡して保存する際に検証をスキップすることもできsave

User.save(validate: false)

属性の長さの検証

class Person < ApplicationRecord
  validates :name, length: { minimum: 2 }
  validates :bio, length: { maximum: 500 }
  validates :password, length: { in: 6..20 }
  validates :registration_number, length: { is: 6 }
end

可能な長さ制約オプションは次のとおりです。

  • :minimum - 属性の長さは指定された長さを下回ることはできません。
  • :maximum - 属性は指定された長さを超えることはできません。
  • :in (または:within ) - 属性の長さは、指定された間隔に含める必要があります。このオプションの値は範囲でなければなりません。
  • :is - 属性の長さは、指定された値と等しくなければなりません。

グループ化の検証

複数の検証で1つの条件を使用すると便利なことがあります。これはwith_optionsを使用して簡単に達成できます。

class User < ApplicationRecord
  with_options if: :is_admin? do |admin|
    admin.validates :password, length: { minimum: 10 }
    admin.validates :email, presence: true
  end
end

with_optionsブロック内のすべてのバリデーションは、次の場合に条件を自動的に渡します::is_admin?

カスタム検証

ActiveModel::ValidatorまたはActiveModel::EachValidator継承する新しいクラスを追加して、独自の検証を追加できます。どちらの方法も似ていますが、若干異なる方法で動作します。

ActiveModel::Validatorおよびvalidates_with

レコードを引数として受け取り、そのレコードに対してvalidate実行するvalidateメソッドを実装します。その後、モデル上のクラスでvalidates_withを使用します。

# app/validators/starts_with_a_validator.rb
class StartsWithAValidator < ActiveModel::Validator
  def validate(record)
    unless record.name.starts_with? 'A'
      record.errors[:name] << 'Need a name starting with A please!'
    end
  end
end
 
class Person < ApplicationRecord
  validates_with StartsWithAValidator
end

ActiveModel::EachValidatorおよびvalidate

単一のパラメータで共通のvalidateメソッドを使用して新しいバリデーターを使用する場合は、 ActiveModel::EachValidatorから継承するクラスを作成し、 recordattribute 、およびvalue 3つの引数を取るvalidate_eachメソッドを実装しvalue

class EmailValidator < 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] || 'is not an email')
    end
  end
end
 
class Person < ApplicationRecord
  validates :email, presence: true, email: true
end

Railsガイドの詳細。

属性のフォーマットを検証します。

属性の値がformatwithオプションを使用する正規表現と一致することを検証withます。

class User < ApplicationRecord
  validates :name, format: { with: /\A\w{6,10}\z/ }
end

定数を定義し、その値を正規表現に設定してwith:オプションに渡すこともできます。実際に複雑な正規表現の方が便利かもしれません

PHONE_REGEX = /\A\(\d{3}\)\d{3}-\d{4}\z/
validates :phone, format: { with: PHONE_REGEX }

デフォルトのエラーメッセージis invalidです。これは:messageオプションで変更できます。

validates :bio, format: { with: /\A\D+\z/, message: "Numbers are not allowed" }

逆も返答し、値が正規表現と一致しないように指定することもできますwithout:オプション

属性の包含を検証する

inclusion:ヘルパーを使用して値が配列に含まれているかどうかを確認できます。 :inオプションとそのエイリアス:in :within許容可能な値のセット。

class Country < ApplicationRecord
  validates :continent, inclusion: { in: %w(Africa Antartica Asia Australia
                                            Europe North America South America) }
end

値が配列に含まれていないかどうかを調べるには、 exclusion:ヘルパーを使用します

class User < ApplicationRecord
  validates :name, exclusion: { in: %w(admin administrator owner) }
end

条件付き検証

場合によっては、特定の条件下でのみレコードを検証する必要がある場合があります。

class User < ApplicationRecord
  validates :name, presence: true, if: :admin? 

  def admin?
    conditional here that returns boolean value
  end
end

あなたが条件付きで本当に小さい場合は、Procを使うことができます:

class User < ApplicationRecord
  validates :first_name, presence: true, if: Proc.new { |user| user.last_name.blank? }
end

負の条件の場合は、次の場合をunless使用できます。

class User < ApplicationRecord
  validates :first_name, presence: true, unless: Proc.new { |user| user.last_name.present? }
end

instance_evalで実行される文字列を渡すこともできinstance_eval

class User < ApplicationRecord
  validates :first_name, presence: true, if: 'last_name.blank?'
end

属性の確認

2つのテキストフィールドが同じ内容を正確に受け取る必要がある場合は、これを使用してください。たとえば、電子メールアドレスまたはパスワードを確認することができます。この検証によって、 _confirmation付けて確認する_confirmationがあるフィールドの名前を名前とする仮想属性が作成されます。

class Person < ApplicationRecord
  validates :email, confirmation: true
end

メモこのチェックは、 email_confirmationがnilでない場合にのみ実行されます。

確認を要求するには、確認属性の存在チェックを必ず追加してください。

class Person < ApplicationRecord
  validates :email,      confirmation: true
  validates :email_confirmation, presence: true
end

ソース

:onオプションを使う

:onオプションを指定すると、検証がいつ行われるかを指定できます。すべてのビルトイン検証ヘルパーのデフォルトの動作は、新しいレコードを作成するときと更新するときの両方で、保存時に実行されます。

class Person < ApplicationRecord
  # it will be possible to update email with a duplicated value
  validates :email, uniqueness: true, on: :create
 
  # it will be possible to create the record with a non-numerical age
  validates :age, numericality: true, on: :update
 
  # the default (validates on both create and update)
  validates :name, presence: true
end


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow