属性の値が一意であることをバリデーション
説明
属性の値が一意であることをバリデーション
使い方
validates_uniqueness_of(フィールド名 [, オプション])
オプション
| オプション | 説明 | デフォルト値 |
|---|---|---|
| :message | 失敗したときに表示するメッセージ | |
| :scope | 一意性制約を決めるために使用する他のカラム | |
| :conditions | 検索条件を指定 | |
| :case_sensitive | 大文字と小文字を区別するか | true |
| :on | 実行するタイミング | 保存時 |
| :allow_nil | nilをスキップ | false |
| :allow_blank | nilや空文字をスキップ | false |
| :if | バリデーションする条件を指定 | |
| :unless | バリデーションしない条件を指定 |
例
属性の値が一意であることをバリデーション
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(フィールド名, 種類 [, オプション])
種類
| 種類 | 説明 |
|---|---|
| :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(バリデーションメソッド名 [, ...])
オプション
| オプション | 説明 | デフォルト値 |
|---|---|---|
| :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
ソースコード
空白であることをバリデーション
説明
指定した要素が空白であることをバリデーション
保存時にデフォルトで実行される
使い方
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 | 失敗した場合に例外を発生 |
例
2つのフィールドが等しいかバリデーション
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.',
tokenizer: ->(str) { str.scan(/\w+/) }
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_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