バリデーション(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