Errors.delete(key) は属性のすべてのエラーを削除しますが、属性に属する特定の種類のエラーのみを削除したいと考えています。この次のメソッドは、任意のモデルに追加できます。
削除された場合はメッセージを返し、それ以外の場合は nil を返します。内部データ構造が変更されるため、エラーの除去後に他のすべてのメソッドが期待どおりに機能するはずです。
MITライセンスの下でリリース
検証の実行後にモデルからエラーを削除する方法。
def remove_error!(attribute, message = :invalid, options = {})
# -- Same code as private method ActiveModel::Errors.normalize_message(attribute, message, options).
callbacks_options = [:if, :unless, :on, :allow_nil, :allow_blank, :strict]
case message
when Symbol
message = self.errors.generate_message(attribute, message, options.except(*callbacks_options))
when Proc
message = message.call
else
message = message
end
# -- end block
# -- Delete message - based on ActiveModel::Errors.added?(attribute, message = :invalid, options = {}).
message = self.errors[attribute].delete(message) rescue nil
# -- Delete attribute from errors if message array is empty.
self.errors.messages.delete(attribute) if !self.errors.messages[attribute].present?
return message
end
使用法:
user.remove_error!(:email, :taken)
指定した属性とメッセージ以外の有効性をチェックするメソッド。
def valid_except?(except={})
self.valid?
# -- Use this to call valid? for superclass if self.valid? is overridden.
# self.class.superclass.instance_method(:valid?).bind(self).call
except.each do |attribute, message|
if message.present?
remove_error!(attribute, message)
else
self.errors.delete(attribute)
end
end
!self.errors.present?
end
使用法:
user.valid_except?({email: :blank})
user.valid_except?({email: "can't be blank"})