Rails 6 删除特定错误 - 删除(:电子邮件)

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

我知道我可以使用

user.errors.delete(: email)
删除电子邮件验证错误,但如果电子邮件上有多个错误,我认为它会删除与电子邮件相关的所有错误。

rails 有办法删除特定的错误消息吗?我只想删除

:already_confirmed
错误。寻找类似的东西:
user.errors.delete( email: :already_confirmed)

=> #<ActiveModel::Errors:0x007feee7ab60ere8
 @base=
  #<User id: 123, email: "[email protected]", created_at: "2020-09-26 19:00:38", updated_at: "2020-09-26 19:01:27", first_name: nil, last_name: nil>,
 @details={:email=>[{:error=>:already_confirmed}]},
 @messages={:email=>["was already confirmed, please try signing in"]}>
ruby validation activerecord ruby-on-rails-6
4个回答
2
投票

rails 中确实应该有一个

user.errors.remove()
方法。然而,这就是我所做的,但我仍然希望有一种更干净的方法。

error_index = user.errors.details[:email].find_index{|i| i[:error] ==  :already_confirmed}
if error_index.present?
  user.errors.messages[:email].delete_at(error_index)
  user.errors.details[:email].delete_at(error_index)
end

0
投票

ActiveModel
不支持任何接口删除特定错误

但是你可以这样:

errors.details[:email].reject! { |detail| detail >= { error: :taken } }
errors.messages[:email].delete(t("activerecord.errors.messages.taken"))

这不是很优雅。但我还没有找到更漂亮的解决方案

第一行包含

Hash#>=
方法。如果一个哈希值是另一个哈希值的一部分,则返回
true
。在上面的示例中,错误哈希 (
detail
) 也将具有
:value

第二行按内容从数组中删除元素。您需要了解错误消息。使用正确的区域设置键值


0
投票

ActiveModel::Errors.delete()
接受 2 个参数:
attribute
type
:

# File activemodel/lib/active_model/errors.rb, line 193
    def delete(attribute, type = nil, **options)
      attribute, type, options = normalize_arguments(attribute, type, **options)
      matches = where(attribute, type, **options)
      matches.each do |error|
        @errors.delete(error)
      end
      matches.map(&:message).presence
    end

所以你可以用

object.errors.delete(:email, :already_confirmed)

来调用它

例如:

object.errors
#=> #<ActiveModel::Errors [#<ActiveModel::Error attribute=email, type=already_confirmed ...

object.errors.delete(:email, :already_confirmed)
#=> it returns the :message associated to this error

object.errors
#=> #<ActiveModel::Errors []>

-1
投票

刚刚遇到这个,你可以做

model.errors.clear

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