module ApiableModelErrors

Public Class Methods

included(base) click to toggle source
# File lib/apiable_model_errors.rb, line 5
def self.included(base)
  base.alias_method_chain :add, :api_errors
  base.alias_method_chain :clear, :api_errors
  base.alias_method_chain :delete, :api_errors
end

Public Instance Methods

add_with_api_errors(attribute, message = :invalid, options = {}) click to toggle source
# File lib/apiable_model_errors.rb, line 45
def add_with_api_errors(attribute, message = :invalid, options = {})
  add_without_api_errors(attribute, message, options).tap do
    errors_for_api[attribute] ||= []
    errors_for_api[attribute] << [message, options || {}]
  end
end
clear_with_api_errors() click to toggle source
# File lib/apiable_model_errors.rb, line 33
def clear_with_api_errors
  clear_without_api_errors.tap do
    @errors_for_api = {}
  end
end
delete_with_api_errors(key) click to toggle source
# File lib/apiable_model_errors.rb, line 39
def delete_with_api_errors(key)
  delete_without_api_errors(key).tap do
    errors_for_api.delete(key)
  end
end
errors_for_api() click to toggle source
# File lib/apiable_model_errors.rb, line 29
def errors_for_api
  @errors_for_api ||= {}
end
has_message?(attribute, message, options = nil) click to toggle source
# File lib/apiable_model_errors.rb, line 52
def has_message?(attribute, message, options = nil)
  if errors = errors_for_api[attribute]
    if error = errors.select { |e| e[0] == message }.first
      if options.nil?
        true # No options specified, if it exists, it's here
      elsif options == error[1]
        true # The options match those on the subejct
      else
        false # The options selected don't match those on the error
      end
    else
      false # No errors of this type
    end
  else
    false # No errors for this attribute
  end
end
to_api_hash() click to toggle source
# File lib/apiable_model_errors.rb, line 11
def to_api_hash
  errors_for_api.each_with_object({}) do |(attribute, errors), hash|
    hash[attribute] = []
    errors.each_with_index do |(message, options), index|
      if message.is_a?(String)
        error = {:message => message}
      else
        error = {
          :code => message,
          :message => messages[attribute][index],
          :options => options
        }
      end
      hash[attribute] << error
    end
  end
end