class ActiveInteraction::Errors

An extension that provides the ability to merge other errors into itself.

Attributes

backtrace[RW]

Public Instance Methods

local_attribute(attribute) click to toggle source

@private

# File lib/active_interaction/errors.rb, line 28
def local_attribute(attribute)
  attribute.to_s.sub(/\A([^.\[]*).*\z/, '\1').to_sym
end
merge!(other) click to toggle source

Merge other errors into this one.

@param other [Errors]

@return [Errors]

# File lib/active_interaction/errors.rb, line 13
def merge!(other)
  other.messages.each do |attribute, messages|
    messages.zip(other.details[attribute]) do |message, detail|
      if detailed_error?(detail)
        merge_detail!(attribute, detail, message)
      else
        merge_message!(attribute, detail, message)
      end
    end
  end

  self
end

Private Instance Methods

attribute?(attribute) click to toggle source
# File lib/active_interaction/errors.rb, line 34
def attribute?(attribute)
  @base.respond_to?(local_attribute(attribute))
end
detailed_error?(detail) click to toggle source
# File lib/active_interaction/errors.rb, line 38
def detailed_error?(detail)
  detail[:error].is_a?(Symbol)
end
merge_detail!(attribute, detail, message) click to toggle source
# File lib/active_interaction/errors.rb, line 54
def merge_detail!(attribute, detail, message)
  if attribute?(attribute) || attribute == :base
    options = detail.dup
    error = options.delete(:error)

    add(attribute, error, **options.merge(message: message)) unless added?(attribute, error, **options)
  else
    merge_message!(attribute, detail, message)
  end
end
merge_message!(attribute, detail, message) click to toggle source
# File lib/active_interaction/errors.rb, line 42
def merge_message!(attribute, detail, message)
  options = detail.dup
  options.delete(:error)

  unless attribute?(attribute)
    message = full_message(attribute, message)
    attribute = :base
  end

  add(attribute, message, **options) unless added?(attribute, message, **options)
end