Railsドキュメント

バリデーション(validation)

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

説明

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

使い方

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

ソースコード

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

説明

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

使い方

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

ソースコード

汎用的なバリデーション

説明

汎用的なバリデーション

使い方

validates(種類, オプション引数)

# 失敗したら例外発生
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

ソースコード

値が空でないか

説明

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

使い方

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

オプション

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

validates_presence_of :first_name

ソースコード

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

説明

バリデーションを定義

使い方

validate(バリデーションメソッド名.., ブロック引数)

# 失敗したら例外発生
validate!(バリデーションメソッド名.., ブロック引数)

オプション

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

バリデーションを定義

validate :must_be_friends

ブロック

validate do |comment|
  comment.must_be_friends
end

ソースコード

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

説明

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

使い方

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

ソースコード

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

説明

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

使い方

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つのフィールドが等しいかバリデーション

説明

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

使い方

validates_confirmation_of(フィールド名..)

オプション

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

  validates_confirmation_of :user_name, :password

ソースコード

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

説明

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

使い方

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

ソースコード

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

説明

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

使い方

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

ソースコード

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

説明

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

使い方

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

ソースコード

文字列の長さをチェック

説明

文字列の長さをチェックするバリデーション

使い方

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.'
end

ソースコード

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

説明

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

使い方

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

ソースコード

指定された属性の値がすべて満たすかどうかを検証

説明

指定された属性の値がすべて満たすかどうかを検証

使い方

validates_comparison_of(属性名..)

オプション

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

class Person < ActiveRecord::Base
  validates_comparison_of :value, greater_than: 'the sum of its parts'
end

ソースコード

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

説明

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

使い方

validates_with(引数.., ブロック引数)

validates_with MyValidator

ソースコード

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

説明

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

使い方

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

ソースコード

例外的とみなされるバリデーションを定義

説明

例外的とみなされるバリデーションを定義

使い方

validates!(属性..)

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates! :name, presence: true
end

person = Person.new
person.name = ''
person.valid?
#=> ActiveModel::StrictValidationFailed: Name can't be blank

ソースコード

モデルを検証するために使われているすべてのバリデータを取得

説明

モデルを検証するために使われているすべてのバリデータを取得

使い方

validators()

class Person
  include ActiveModel::Validations

  validates_with MyValidator
  validates_with OtherValidator, on: :create
  validates_with StrictValidator, strict: true
end

Person.validators
#=> [
#      <MyValidator:0x007fbff403e808 @options={}>,
#      <OtherValidator:0x007fbff403d930 @options={on: :create}>,
#      <StrictValidator:0x007fbff3204a30 @options={strict:true}>
#    ]

ソースコード

指定した属性のバリデーションに使用されているすべてのバリデータを一覧表示

説明

指定した属性のバリデーションに使用されているすべてのバリデータを一覧表示

使い方

validators_on(属性..)

class Person
  include ActiveModel::Validations

  attr_accessor :name , :age

  validates_presence_of :name
  validates_inclusion_of :age, in: 0..99
end

Person.validators_on(:name)
#=> [
#       <ActiveModel::Validations::PresenceValidator:0x007fe604914e60 @attributes=[:name], @options={}>,
#    ]

ソースコード

Errorsオブジェクトを取得

説明

Errorsオブジェクトを取得

使い方

モデル.errors()

person = Person.new
person.valid? #=> false
person.errors #=> #<ActiveModel::Errors:0x007fe603816640 @messages={name:["can't be blank"]}>

ソースコード

エラーがないか

説明

エラーがないか

使い方

モデル.valid?(コンテキスト=nil)

エラーがないか

person = Person.new
person.name = ''
person.valid? #=> false
person.name = 'david'
person.valid? #=> true

コンテキスト指定

person = Person.new
person.valid?       #=> true
person.valid?(:new) #=> false

ソースコード

エラーが追加されたか

説明

エラーが追加されたか

使い方

モデル.invalid?(コンテキスト=nil)

エラーが追加されたか

person = Person.new
person.name = ''
person.invalid? #=> true
person.name = 'david'
person.invalid? #=> false

コンテキスト指定

person = Person.new
person.invalid?       #=> false
person.invalid?(:new) #=> true

ソースコード