Errors.delete (ключ) удаляет все ошибки для атрибута, и я хочу удалить только определенный тип ошибок, принадлежащих атрибуту. Этот следующий метод может быть добавлен к любой модели.
Возвращает сообщение, если удалено, в противном случае ноль. Внутренние структуры данных изменены, поэтому все другие методы должны работать, как и ожидалось, после устранения ошибок.
Выпущено по лицензии 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"})