この記事はアピリッツの技術ブログ「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
こうしておくと、save
やvalid?
で:change_password
というコンテキストが指定されたときだけ、このバリデーションがチェックされます。
逆に「このコンテキストでないときだけチェックしたい」という指定をするときは、カスタムバリデーションのメソッドを書いて、その中でコンテキストをチェックすることができます。
validate :check_not_on_password
def check_not_on_password
# コンテキストが :change_password のときはなにもしない
return if validation_context == :change_password
:
:
end