その他
    ホーム 技術発信 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