ActiveRecord(検証)
検証
validates フィールド名, 検証用ハッシュオブジェクト 存在:presence 長さ:length
存在してるか
class Post < ActiveRecord::Base validation :title, :presence => true end #Error post = Post.new(title: "aaa", body: "validation") post = Post.new(title: "aaa", body: "validation") post.valid? =>false p post.errors[:title] =>["can't be blank"] p post.errors.full_messages =>["Title can't be blank"] p post.errors.messages =>{:title=>["can't be blank"]} #Past post = Post.new(title: "aaa", body: "validation") true p post.errors[:title] =>[ ] p post.errors.full_messages =>[ ] p post.errors.messages =>{:title=>[ ]}
長さ検証 (length)
#長さが最低5文字の検証 class Post < ActiveRecord::Base validation :title, presence: true validates :body, length: { minimum: 5 } validates :password, length: { in: 6..20 }#6から20の間 validates :password, length: { is: 6 } #6と等しい end post = Post.new(title: "あああ", body: "va") p post.valid? =>false p post.errors[:body] =>["is too short (minimum is 3 characters)"] p post.errors.full_messages => ["Body is too short (minimum is 3 characters)"] p post.errors.messages =>{:body=>["is too short (minimum is 3 characters)"]}
数値かどうか(numericality)
class Post < ActiveRecord::Base validates :age, numericality: true validates :age, numericality: { only_integer: true } validates :age, numericality: { greater_than: 20 } validates :age, numericality: { less_than: 20 } end
:greater_than - 指定された値よりも大きくなければならないことを指定します。
:greater_than_or_equal_to - 指定された値と等しいか、それよりも大きくなければならないことを指定します。
:equal_to - 指定された値と等しくなければならないことを示します。
:less_than - 指定された値よりも小さくなければならないことを指定します。
:less_than_or_equal_to - 指定された値と等しいか、それよりも小さくなければならないことを指定します。
:odd - trueに設定されている場合は、奇数でなければなりません。
:even - trueに設定されている場合は、偶数でなければなりません。
acceptance
format
formatで正規表現に合う文字列以外にエラーを出す {with: 正規表現} class Post < ActiveRecord::Base validates :title, format: { with: /\A[a-zA-Z]+\z/, message: "英文字のみが使用できます" }, end post = Post.new(title: "あああ", body: "validation") post.save p post.valid? =>false p post.errors[:title] =>["英文字のみが使用できます"]
uniqueness 一意性の確保のためDBにすでに存在しているとエラーメッセージを出す。
class Post < ActiveRecord::Base validates :title, uniqueness: true validates :body, length: {minimum: 3} end post = Post.new(title: "Hahaha", body: "validation") post.save p post.valid? =>false p post.errors[:title] =>["has already been taken"]