古いバージョンのドキュメントです。最新のバージョンはRails7.0.0

Railsドキュメント(v6.0.2.1)

属性の値が一意であることをバリデーション

layout: page

説明

属性の値が一意であることをバリデーション

使い方

validates_uniqueness_of(フィールド名 [, オプション])

オプション

オプション 説明 デフォルト値
:message 失敗したときに表示するメッセージ  
:scope 一意性制約を決めるために使用する他のカラム  
:conditions 検索条件を指定  
:case_sensitive 大文字と小文字を区別するか true
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

属性の値が一意であることをバリデーション

validates_uniqueness_of :user_name, scope: :account_id

ソースコード

関連付けられているオブジェクトをバリデーション

layout: page

説明

関連しているモデルもバリデーション
関連付けが無い場合はバリデーションは成功

使い方

validates_associated(バリデーション対象 [, ...])

オプション

オプション 説明 デフォルト値
:message 失敗したときに表示するメッセージ  
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

関連しているモデルもバリデーション

class Book < ActiveRecord::Base
  has_many :pages
  belongs_to :library
  validates_associated :pages, :library
end

ソースコード

汎用的なバリデーション

layout: page

説明

汎用的なバリデーション

使い方

validates(フィールド名, 種類 [, オプション])

種類

種類 説明
:acceptance チェックボックスがオンになっているか
:confirmation テキストフィールドが完全に一致するか
:exclusion 含まれていないことをバリデーション
:format 正規表現と一致するか
:inclusion 含まれていることをバリデーション
:length 長さをバリデーション
:numericality 数値のみか
:presence 空で無いこと
:absence 空であること
:uniqueness 重複していないこと

オプション

オプション 説明
:on 実行するタイミング
:if バリデーションする条件を指定
:unless バリデーションしない条件を指定
:allow_nil nilをスキップ
:allow_blank nilや空文字をスキップ
:strict 例外が発生するか
:message 失敗したときに表示するメッセージ

lengthのオプション

オプション 説明
:minimum この値より小さな値か
:maximum: この値より大きな値が
:inまたは:within 区間以内か
:is 値と等か?

numericalityのオプション

オプション 説明
:greater_than 指定した値よりも大きいか
:greater_than_or_equal_to 指定した値と等しいか、それよりも大きいか
:equal_to 指定した値と等しいか
:less_than 指定した値よりも小さいか
:less_than_or_equal_to 指定した値と等しいか、それよりも小さいか
:other_than 指定した値以外の値か
:odd 奇数か
:even 偶数か

acceptance

チェックボックスがオンになっているか
validates :form, acceptance: true
チェックボックスがオフになっているか
validates :form, acceptance: false

confirmation

テキストフィールドが完全に一致するか
validates :email, confirmation: true
テキストフィールドが完全に一致しないか
validates :email, confirmation: false

exclusion

含まれていないか
validates :subdomain, exclusion: {in: %w(www us ca jp)}

format

正規表現と一致するか
validates :legacy_code, format: {with: /\A[a-zA-Z]+\z/}

inclusion

含まれていることをバリデーション
validates :size, inclusion: {in: %w(small medium large)}

length

長さをバリデーション
validates :name, length: {minimum: 2}

numericality

数値のみか
validates :points, numericality: true

presence

空で無いこと
validates :name, :login, :email, presence: true

absence

空であること
validates :name, :login, :email, absence: true

uniqueness

重複していないこと
validates :email, uniqueness: true

ソースコード

値が空でないか

layout: page

説明

値が空でないかをバリデーション

使い方

validates_presence_of(バリデーション対象 [, ...])

オプション

オプション 説明  
:message 失敗したときに表示するメッセージ  
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

値が空でないかをバリデーション

validates_presence_of :first_name

ソースコード

モデルのバリデーションを定義

layout: page

説明

バリデーションを定義

使い方

validate(バリデーションメソッド名 [, ...])

オプション

オプション 説明 デフォルト値
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

バリデーションを定義

class Comment
  include ActiveModel::Validations

  validate :must_be_friends

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
end

ブロック

class Comment
  include ActiveModel::Validations

  validate do |comment|
    comment.must_be_friends
  end

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
end

ソースコード

空白であることをバリデーション

layout: page

説明

指定した要素が空白であることをバリデーション
保存時にデフォルトで実行される

使い方

validates_absence_of(フィールド名 [, ...])

オプション

オプション 説明 初期値
:message 失敗したときに表示するメッセージ must be accepted
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

指定した要素が空白であることをバリデーション

class Person < ActiveRecord::Base
  validates_acceptance_of :terms_of_service
  validates_acceptance_of :eula, message: 'must be abided'
end

ソースコード

チェックボックスにチェックが入っているかバリデーション

layout: page

説明

チェックボックスにチェックが入っているかバリデーション

使い方

validates_acceptance_of(フィールド名 [, ...])

オプション

オプション 説明 初期値
:message 失敗したときに表示するメッセージ must be accepted
:accept 同意済みとみなす値を設定 1
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

チェックボックスにチェックが入っているかバリデーション

class Person < ActiveRecord::Base
  validates_acceptance_of :terms_of_service
  validates_acceptance_of :eula, message: 'must be abided'
end

ソースコード

2つのフィールドが等しいかバリデーション

layout: page

説明

2つのフィールドが等しいかバリデーション

使い方

validates_confirmation_of(フィールド名 [, ...])

オプション

オプション 説明 初期値
:message 失敗したときに表示するメッセージ must be accepted
:case_sensitive 完全一致 true
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

2つのフィールドが等しいかバリデーション

  validates_confirmation_of :user_name, :password

ソースコード

値が配列・範囲に含まれていないかバリデーション

layout: page

説明

値が配列・範囲に含まれていないかバリデーション

使い方

validates_exclusion_of(フィールド名 [, ...])

オプション

オプション 説明 初期値
:in 比較対象の配列、または範囲オブジェクト  
:within 比較対象の配列、または範囲オブジェクトの範囲  
:message 失敗したときに表示するメッセージ must be accepted
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

値が配列・範囲に含まれていないかバリデーション

class Person < ActiveRecord::Base
  validates_exclusion_of :username, in: %w( admin superuser ), message: "You don't belong here"
  validates_exclusion_of :age, in: 30..60, message: 'This site is only for under 30 and over 60'
  validates_exclusion_of :format, in: %w( mov avi ), message: "extension %{value} is not allowed"
  validates_exclusion_of :password, in: ->(person) { [person.username, person.first_name] },
                         message: 'should not be the same as your username or first name'
  validates_exclusion_of :karma, in: :reserved_karmas
end

ソースコード

正規表現パターンに一致しているかバリデーション

layout: page

説明

正規表現パターンに一致しているかバリデーション

使い方

validates_format_of(フィールド名 [, ...])

オプション

オプション 説明 初期値
:message 失敗したときに表示するメッセージ must be accepted
:with 正規表現パターン  
:without 正規表現パターン  
:multiline 行の先頭または、末尾  
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

正規表現パターンに一致しているかバリデーション

validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/, on: :create

ソースコード

値が配列・範囲に含まれているかバリデーション

layout: page

説明

値が配列・範囲に含まれているかバリデーション

使い方

validates_inclusion_of(フィールド名 [, ...])

オプション

オプション 説明 初期値
:in 文字列長の範囲(range型)  
:within 比較対象の配列、または範囲オブジェクトの範囲  
:message 失敗したときに表示するメッセージ must be accepted
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

値が配列・範囲に含まれているかバリデーション

class Person < ActiveRecord::Base
  validates_inclusion_of :gender, in: %w( m f )
  validates_inclusion_of :age, in: 0..99
  validates_inclusion_of :format, in: %w( jpg gif png ), message: "extension %{value} is not included in the list"
  validates_inclusion_of :states, in: ->(person) { STATES[person.country] }
  validates_inclusion_of :karma, in: :available_karmas
end

ソースコード

文字列の長さをチェック

layout: page

説明

文字列の長さをチェック

使い方

validates_length_of(するフィールド名 [, ...])

オプション

オプション 説明 デフォルト値
:minimum 最小の文字列長  
:maximum 最大の文字列長  
:is 長さが同じこと  
:within 文字列長の範囲  
:in 文字列長の範囲  
:too_long :maximumに違反したときの、エラーメッセージ  
:too_short :minimumに違反したときの、エラーメッセージ  
:wrong_length :isに違反したときの、エラーメッセージ  
:message 失敗したときに表示するメッセージ  
:tokenizer 文字列の分割方法  
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

文字列の長さをチェック

class Person < ActiveRecord::Base
  validates_length_of :first_name, maximum: 30
  validates_length_of :last_name, maximum: 30, message: "less than 30 if you don't mind"
  validates_length_of :fax, in: 7..32, allow_nil: true
  validates_length_of :phone, in: 7..32, allow_blank: true
  validates_length_of :user_name, within: 6..20, too_long: 'pick a shorter name', too_short: 'pick a longer name'
  validates_length_of :zip_code, minimum: 5, too_short: 'please enter at least 5 characters'
  validates_length_of :smurf_leader, is: 4, message: "papa is spelled with 4 characters... don't play me."
  validates_length_of :essay, minimum: 100, too_short: 'Your essay must be at least 100 words.',
                      tokenizer: ->(str) { str.scan(/\w+/) }
end

ソースコード

数値の大小、型をチェック

layout: page

説明

数値の大小、型をバリデーション

使い方

validates_numericality_of(フィールド名 [, ...])

オプション

オプション 説明  
:message 失敗したときに表示するメッセージ  
:only_integer 整数であるか  
:greater_than 指定値より大きいか  
:greater_than_or_equal_to 指定値以上か  
:equal_to 指定値と等しいか  
:less_than 指定値未満か  
:less_than_or_equal_to 指定値以下か  
:odd 奇数か  
:even 偶数か  
:on 実行するタイミング 保存時
:allow_nil nilをスキップ false
:allow_blank nilや空文字をスキップ false
:if バリデーションする条件を指定  
:unless バリデーションしない条件を指定  
:strict 失敗した場合に例外を発生  

数値の大小、型をバリデーション

validates_numericality_of :value, on: :create

ソースコード

バリデーションの別クラスにエラーを追加

layout: page

説明

バリデーションの別クラスにレコードを渡して、より複雑な条件に基づいたエラーを追加

使い方

validates_with(引数)

validates_with MyValidator

ソースコード

ブロックに対してのバリデーション

layout: page

説明

ブロックに対してのバリデーション

使い方

validates_each(キー名, [,  オプション])

オプション

オプション 説明
:on 実行するタイミング
:allow_nil nilをスキップ
:allow_blank nilや空文字をスキップ
:if バリデーションする条件
:unless バリデーションしない条件

validates_each :first_name, :last_name, allow_blank: true do |record, attr, value|
  record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
end

ソースコード