t11hi

hene

バリデーションを好きなときに実行する

バリデーションを好きなときに実行する

あるバリデーションをこのフォームでは実行して、管理画面のフォームでは実行しないというように、 各フォームでバリデーションを実行するか指定したい場合、以下のような方法があります。

コンテキストとして :sample を渡す

コンテキストとして :sample を渡した場合と渡さなかった場合で、バリデーションを実行するか設定できます。

:::tip コンテキストの :sample は例で :hoge など他のコンテキストを渡して大丈夫です。 :::

save(context: :sample)

モデルを保存する前にバリデーションを実行します。

@model.save(context: :sample)

valid?(:sample)

バリデーションを実行します。

@model.valid?(:sample)

update

update するときにコンテキストを渡して、バリデーションを実行したい場合は以下のようにすることで実行できます。

@model.attributes = { name: 'テストテスト' }
@model.save(context: :sample)

コンテキストを渡したとき、バリデーションを実行する

方法 1

# app/models/model.rb

validates :name, presence: true, if: -> { validation_context == :sample }

方法 2

# app/models/model.rb

validates :name, presence: true, on: :sample

方法 3

# app/models/model.rb

validates :name, presence: true, if: :sample?

def sample?
  validation_context == :sample
end

コンテキストを渡したとき、バリデーションを実行しない

方法 1

# app/models/model.rb

validates :name, presence: true, unless: -> { validation_context == :sample }

方法 2

# app/models/model.rb

validates :name, presence: true, unless: :sample?

def sample?
  validation_context == :sample
end

参考