Rails 6 特定のエラーを削除する - delete(:email)

概要

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"]}>

解決策

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