Skip to content

Commit f084e1f

Browse files
committed
Merge pull request #559 from alces-software/validation-errors-can-have-metadata
Validation errors can have metadata added to them
2 parents c9cc807 + b945e1f commit f084e1f

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

lib/jsonapi/exceptions.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,10 +355,11 @@ def errors
355355
end
356356

357357
class ValidationErrors < Error
358-
attr_reader :error_messages, :resource_relationships
358+
attr_reader :error_messages, :error_metadata, :resource_relationships
359359

360360
def initialize(resource)
361361
@error_messages = resource.model_error_messages
362+
@error_metadata = resource.validation_error_metadata
362363
@resource_relationships = resource.class._relationships.keys
363364
@key_formatter = JSONAPI.configuration.key_formatter
364365
end
@@ -380,7 +381,13 @@ def json_api_error(attr_key, message)
380381
status: :unprocessable_entity,
381382
title: message,
382383
detail: "#{format_key(attr_key)} - #{message}",
383-
source: { pointer: pointer(attr_key) })
384+
source: { pointer: pointer(attr_key) },
385+
meta: metadata_for(attr_key, message))
386+
end
387+
388+
def metadata_for(attr_key, message)
389+
return if error_metadata.nil?
390+
error_metadata[attr_key] ? error_metadata[attr_key][message] : nil
384391
end
385392

386393
def pointer(attr_or_relationship_name)

lib/jsonapi/resource.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,29 @@ def model_error_messages
120120
_model.errors.messages
121121
end
122122

123+
# Add metadata to validation error objects.
124+
#
125+
# Suppose `model_error_messages` returned the following error messages
126+
# hash:
127+
#
128+
# {password: ["too_short", "format"]}
129+
#
130+
# Then to add data to the validation error `validation_error_metadata`
131+
# could return:
132+
#
133+
# {
134+
# password: {
135+
# "too_short": {"minimum_length" => 6},
136+
# "format": {"requirement" => "must contain letters and numbers"}
137+
# }
138+
# }
139+
#
140+
# The specified metadata is then be merged into the validation error
141+
# object.
142+
def validation_error_metadata
143+
{}
144+
end
145+
123146
# Override this to return resource level meta data
124147
# must return a hash, and if the hash is empty the meta section will not be serialized with the resource
125148
# meta keys will be not be formatted with the key formatter for the serializer by default. They can however use the

0 commit comments

Comments
 (0)