hene

hene.dev

バリデーションを任意のタイミングで実行する

バリデーションを任意のタイミングで実行する

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

コンテキストを渡す

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

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

save(context: :sample)

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

model.save(context: :sample)

valid?(:sample)

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

model.valid?(:sample)

update

update する際は、直接コンテキストを渡して、バリデーションを実行することはできません。 以下のようにすることでバリデーションを実行して更新できます。

#attributes=

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

#assign_attributes

model.assign_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

すべてのバリデーションを実行しない

#attributes=

model.attributes = { name: 'テストテスト' }
model.save(validate: false)

#assign_attributes

model.assign_attributes(name: 'テストテスト')
model.save(validate: false)

参考

関連記事