ruby 如何在Rails中删除after_validation中的错误

yshpjwxd  于 2023-08-04  发布在  Ruby
关注(0)|答案(2)|浏览(138)

我希望能够在验证失败时将模型上的一些值设置为null。我的模型是这样设置的:

  1. class MyModel < ApplicationRecord
  2. attr_accessor :should_set_fields_to_null_if_invalid
  3. NULL_IF_INVALID_FIELDS = [:address, :phone]
  4. after_validation :set_fields_to_null_if_invalid, if: :should_set_fields_to_null_if_invalid
  5. ...
  6. # custom validations for address and phone
  7. ...
  8. def set_fields_to_null_if_invalid
  9. NULL_IF_INVALID_FIELDS.each do |attribute|
  10. self[attribute] = nil if errors.key?(attribute)
  11. errors.delete(attribute)
  12. end
  13. end
  14. end

字符串
基本上,如果存在错误,我会删除它并将属性设置为null,但我会得到以下错误:

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


不知道为什么它仍然失败,没有验证消息。有没有人对实施这一点有什么建议?

mlmc2os5

mlmc2os51#

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

  1. begin
  2. @my_model_instance.save!
  3. rescue
  4. # fix the problematic attributes and save again
  5. end

字符串
但是,验证通常用于通知用户他们需要修复输入中的某些内容。一个更好的方法是简单地测试address和phone属性,如果测试失败就修复它们,而不使用ActiveRecord的验证方案,如下所示:

  1. class MyModelController < ApplicationController
  2. def create
  3. # read csv file
  4. @my_model = MyModel.new(...params from csv file...)
  5. @my_model.address = nil unless @my_model.valid_imported_address?
  6. @my_model.phone = nil unless @my_model.valid_imported_phone?
  7. @my_model.save!
  8. end
  9. end
  10. class MyModel < ApplicationRecord
  11. def valid_imported_address?
  12. # some test for compliant address, return true if acceptable
  13. end
  14. def valid_imported_phone?
  15. # some test for compliant phone, return true if acceptable
  16. end
  17. end

展开查看全部
daolsyd0

daolsyd02#

我可以让它工作,而不是使用after_validation,我只是使用validation

  1. after_validation :set_fields_to_null_if_invalid, if: :should_set_fields_to_null_if_invalid

字符串

  1. validate :set_fields_to_null_if_invalid, if: :should_set_fields_to_null_if_invalid

相关问题