読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

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:の引数は配列が渡せなかったので、記述が冗長ぎみだけど。