ホーム DoRuby バリデーションでコンテキストを活用する
 

バリデーションでコンテキストを活用する

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Railsのバリデーションではコンテキストと呼ばれる情報を使うことができます。
コンテキストはシンボルで表現されます。

コンテキストの種類

レコードをINSERTするときのコンテキストは :create、 UPDATEするときのコンテキストは :update です。

レコードを最初に保存するときと、あとで更新するときで検査する項目や内容を変えたいとき、 :create と :update で区別すればうまく実装できます。

またvalid?などで特に指定しない場合のデフォルトのコンテキストは nil です。

コンテキストを定義する

その他にも、ユーザーが任意のシンボルを使ってコンテキストを指定することができます。

たとえばここで、 :change_password というシンボルを使ってユーザーのパスワード更新というコンテキストを表そうと思います。

saveするときのコンテキストを指定する

user.save(context: :change_password)

バリデーションを実行するときにコンテキストを指定する

user.valid?(:change_password)

コンテキストを活用する

このコンテキストをバリデーション側で受け取るには on: パラメータを使います

validates :password, presense: true, on: :change_password

こうしておくと、savevalid?:change_passwordというコンテキストが指定されたときだけ、このバリデーションがチェックされます。

逆に「このコンテキストでないときだけチェックしたい」という指定をするときは、カスタムバリデーションのメソッドを書いて、その中でコンテキストをチェックすることができます。

validate :check_not_on_password

def check_not_on_password
  # コンテキストが :change_password のときはなにもしない
  return if validation_context == :change_password

  :
  :
end
記事を共有
モバイルバージョンを終了