Module: JSONAPIHelpers::Serializers::ModelError

Defined in:
lib/jsonapi_helpers/serializers/model_error.rb

Constant Summary collapse

KNOWN_ERROR_TYPES =
Set.new(%i(
  accepted
  blank
  confirmation
  empty
  equal_to
  even
  exclusion
  greater_than
  greater_than_or_equal_to
  inclusion
  invalid
  less_than
  less_than_or_equal_to
  not_a_number
  not_an_integer
  odd
  other_than
  present
  required
  taken
  too_long
  too_short
  wrong_length
)).freeze

Class Method Summary collapse

Class Method Details

.error_message_for(model_errors, field, error) ⇒ Object



49
50
51
52
53
54
# File 'lib/jsonapi_helpers/serializers/model_error.rb', line 49

def self.error_message_for(model_errors, field, error)
  message = error.fetch(:error)
  return message if message.is_a?(String) # expects it to already be translated

  model_errors.generate_message(field, message, count: error[:count])
end

.error_meta_for(error) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/jsonapi_helpers/serializers/model_error.rb', line 56

def self.error_meta_for(error)
  meta = {
    type: error_type_for(error.fetch(:error))
  }
  meta[:count] = error[:count] if error[:count]
  meta[:value] = error[:value] if error[:value]
  meta
end

.error_type_for(error_type) ⇒ Object



65
66
67
68
# File 'lib/jsonapi_helpers/serializers/model_error.rb', line 65

def self.error_type_for(error_type)
  return error_type if KNOWN_ERROR_TYPES.include?(error_type)
  :invalid
end

.serialize(model, key_transform: JSONAPIHelpers.config.key_transform) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/jsonapi_helpers/serializers/model_error.rb', line 34

def self.serialize(model, key_transform: JSONAPIHelpers.config.key_transform)
  model.errors.details.flat_map do |field, errors|
    errors.map do |error|
      attribute_name = KeyTransform.call(field.to_s, key_transform: key_transform)

      {
        status: 422,
        source: { pointer: "/data/attributes/#{attribute_name}" },
        detail: error_message_for(model.errors, field, error),
        meta: error_meta_for(error)
      }
    end
  end
end