如果验证失败,我希望能够将模型上的某些值设置为 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!'
不知道为什么在没有验证消息的情况下仍然失败。有人对实施这个有建议吗?
您使用
save!
保存记录,这会引发异常...因此您的 after_validation
方法永远不会执行。您可以使用 save
方法而不是 save!
,否则您可以挽救异常并修复属性值:
begin
@my_model_instance.save!
rescue
# fix the problematic attributes and save again
end
但是,验证通常用于通知用户他们需要修复输入中的某些内容。更好的方法是简单地测试地址和电话属性,如果测试失败则修复它们,而不使用 ActiveRecord 的验证方案。