Railsで「このタイミングだけこのバリデーションしたい」っていうとき
パスワードの変更機能を作ってて
- パスワードはUserモデルの一部
- パスワード変更画面は他の項目(都道府県とかのプロフィール項目)を変更する画面とは別
である場合、新しいパスワード(:password)はプロフィール変更時はバリデーションしたくなくて、ユーザー登録時とパスワード変更時のときだけバリデーションしたい、ということになる。
Userモデルとして考えた時、登録時だけ、とか変更時だけっていう場合は以下のようにon: :createとかon: :updateとかすればいいんだけど、この場合はそれじゃ辻褄が合わない。
validates :password, length: {minimum: MIN_LENGTH_PASSWORD}, on: :create
どうすんべー、と思ってたら、このon: :hogehogeはテキトウに定義できるんだって。
http://api.rubyonrails.org/classes/ActiveRecord/Validations.html#method-i-save
だからこんな感じにしとけばよかろうもん。
user.rb
validates :password, length: {minimum: MIN_LENGTH_PASSWORD}, on: :create validates :password, length: {minimum: MIN_LENGTH_PASSWORD}, on: :password_update validates :password, length: {minimum: MIN_LENGTH_PASSWORD}, on: :update, allow_blank: true
users_controller.tb
@user.assign_attributes params[:user] if @user.save(context: :password_update) ~snip~ end
on:の引数は配列が渡せなかったので、記述が冗長ぎみだけど。