我希望能够在验证失败时将模型上的一些值设置为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!'
型
不知道为什么它仍然失败,没有验证消息。有没有人对实施这一点有什么建议?
2条答案
按热度按时间mlmc2os51#
您使用
save!
保存记录,这会引发异常...所以你的after_validation
方法永远不会执行。您可以使用save
方法而不是save!
,或者您可以挽救异常并修复属性值:字符串
但是,验证通常用于通知用户他们需要修复输入中的某些内容。一个更好的方法是简单地测试address和phone属性,如果测试失败就修复它们,而不使用ActiveRecord的验证方案,如下所示:
型
daolsyd02#
我可以让它工作,而不是使用
after_validation
,我只是使用validation
:字符串
至
型