ある条件の時だけモデルの検証をしたい

Rails4

ある条件の時だけモデルの検証をしたい時といえば、
ユーザ情報更新する入力画面でパスワードの検証は毎回したくない。
でもパスワードの変更がある時だけパスワード系項目の検証をしたい。とかそういう時だと思う。

update(create)の時だけ検証する

onオプションを使う

model Cat
  validates  :wight, presence: true, on: :update
end

上のようにonオプションにupdateシンボルを渡すことでupdateの時だけこの検証が有効になる。
同様にcreateシンボルを渡すとcreateの時だけ有効。舐められたら無効。

入力項目が表示中の時だけ検証する

ifオプションを使う

model Cat
  validates  :owner, presence: true, if: :owner
end

ifオプションに与えている項目名が、入力フォームに存在している時にこの検証が有効になる。
入力値が入っている時はもちろん、空欄でも検証が有効になる。

任意の条件の時だけ検証する

model Cat
  validates  :owner, presence: true, if: -> { owner.present? }
end

ifオプションにprocオブジェクトを渡すことができる。(この『->』はRuby1.9からみたい。)
自明だけどブロックの中が真になる時に検証が有効になる。
ちなみにselfはCatインスタンス

ifオプションって、if文あるあると似た見た目同じなので、よく見るとすごく馴染んでると思う。

p("unko") if true