如何消除 Rails 中 after_validation 中的错误

问题描述 投票:0回答:1

如果验证失败,我希望能够将模型上的某些值设置为 null。我的模型设置如下:

class MyModel < ApplicationRecord
  attr_accessor :should_set_fields_to_null_if_invalid

  NULL_IF_INVALID_FIELDS = [:address, :phone]

  after_validation :set_fields_to_null_if_invalid, if: :should_set_fields_to_null_if_invalid
  ...
  # custom validations for address and phone
  ...

  def set_fields_to_null_if_invalid
    NULL_IF_INVALID_FIELDS.each do |attribute|
      self[attribute] = nil if errors.key?(attribute)
      errors.delete(attribute)
    end
  end
end

基本上,我将删除错误(如果存在)并将属性设置为 null,但出现以下错误:

     ActiveRecord::RecordInvalid:
       Validation failed: 
     # /Users/albertjankowski/.rvm/gems/ruby-3.0.3/gems/activerecord-6.1.7.3/lib/active_record/validations.rb:80:in `raise_validation_error'
     # /Users/albertjankowski/.rvm/gems/ruby-3.0.3/gems/activerecord-6.1.7.3/lib/active_record/validations.rb:53:in `save!'

不知道为什么在没有验证消息的情况下仍然失败。有人对实施这个有建议吗?

ruby-on-rails ruby activerecord activemodel
1个回答
0
投票

您使用

save!
保存记录,这会引发异常...因此您的
after_validation
方法永远不会执行。您可以使用
save
方法而不是
save!
,否则您可以挽救异常并修复属性值:

begin
  @my_model_instance.save!
rescue
  # fix the problematic attributes and save again
end

但是,验证通常用于通知用户他们需要修复输入中的某些内容。更好的方法是简单地测试地址和电话属性,如果测试失败则修复它们,而不使用 ActiveRecord 的验证方案。

© www.soinside.com 2019 - 2024. All rights reserved.