属性の値が一意であることをバリデーション
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