忘れがちなのでRails バリデーションをまとめました。
##チェックボックスのオン・オフ
acceptance
validates :terms_of_service, acceptance: true
##関連付けされている両方のモデルでバリデーションを実行する
validates_associated
class Library < ApplicationRecord
has_many :books
validates_associated :books
end
##2つのテキストフィールドの完全一致
confirmation
class Person < ApplicationRecord
validates :email, confirmation: true
end
<%= text_field :person, :email %>
<%= text_field :person, :email_confirmation %>
##指定した値が含まれていない
exclusion
validates :subdomain, exclusion: { in: %w(www us ca jp),
message: "%{value}は予約済みです" }
##指定した値が含まれている
inclusion
validates :size, inclusion: { in: %w(small medium large),
message: "%{value} のサイズは無効です" }
##正規表現の一致
format
validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/,
message: "英文字のみが使用できます" }
##長さ
length
validates :name, length: { minimum: 2 }
validates :bio, length: { maximum: 500 }
validates :password, length: { in: 6..20 }
validates :registration_number, length: { is: 6 }
##整数か浮動小数が使用されている
numericality
validates :points, numericality: true
##空でない
presence
validates :name, :login, :email, presence: true
##boolean属性で空でない
inclusion: { in: [true, false] }
validates :boolean_field_name, inclusion: { in: [true, false] }
##値が重複しない
uniqueness
validates :email, uniqueness: true
##バリデーションが実行される条件を指定する
:if
validates :card_number, presence: true, if: :paid_with_card?
##バリデーションが実行される条件を指定してまとめて実行する
with_options
with_options if: :is_admin? do |admin|
admin.validates :password, length: { minimum: 10 }
admin.validates :email, presence: true
##バリデーションのタイミング
バリデーションはnewやsaveで保存された時に実行されるので、
newでインスタンス化されたオブジェクトではエラーは報告されない
##バリデーションが通るか手動で確認
valid? invalid
Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false
##エラーメッセージの配列を取得する
errors.messages
person = Person.new
person.valid? # => false
person.errors.messages
# {:name=>["空欄にはできません", "短すぎます (最小3文字)"]}
##エラーの属性名を最初に追加して、見やすい形でエラーメッセージを表示する
errors.full_messages(errors.to_a)
person.errors[:name]
# => ["は以下の文字を含むことができません !@#%*()_-+="]
person.errors.full_messages
# => ["Name は以下の文字を含むことができません !@#%*()_-+="]
##オブジェクトの状態全体に関連するエラーメッセージを追加する
errors[:base]
errors[:base] << "この人物は以下の理由で無効です..."