バリデーションを任意のタイミングで実行する
バリデーションを任意のタイミングで実行する
あるバリデーションをユーザー側のフォームでは実行して、管理画面のフォームでは実行しないというように、 各フォームでバリデーションを実行するか指定したい場合、以下のような方法があります。
コンテキストを渡す
コンテキストを渡した場合と渡さなかった場合で、バリデーションを実行するか設定できます。
- コンテキストの
: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)