Skip to content

Commit b945e1f

Browse files
committed
Validation errors can have metadata added to them
1 parent 7aca6a8 commit b945e1f

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
@@ -301,10 +301,11 @@ def errors
301301
end
302302

303303
class ValidationErrors < Error
304-
attr_reader :error_messages, :resource_relationships
304+
attr_reader :error_messages, :error_metadata, :resource_relationships
305305

306306
def initialize(resource)
307307
@error_messages = resource.model_error_messages
308+
@error_metadata = resource.validation_error_metadata
308309
@resource_relationships = resource.class._relationships.keys
309310
@key_formatter = JSONAPI.configuration.key_formatter
310311
end
@@ -326,7 +327,13 @@ def json_api_error(attr_key, message)
326327
status: :unprocessable_entity,
327328
title: message,
328329
detail: "#{format_key(attr_key)} - #{message}",
329-
source: { pointer: pointer(attr_key) })
330+
source: { pointer: pointer(attr_key) },
331+
meta: metadata_for(attr_key, message))
332+
end
333+
334+
def metadata_for(attr_key, message)
335+
return if error_metadata.nil?
336+
error_metadata[attr_key] ? error_metadata[attr_key][message] : nil
330337
end
331338

332339
def pointer(attr_or_relationship_name)

lib/jsonapi/resource.rb

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

124+
# Add metadata to validation error objects.
125+
#
126+
# Suppose `model_error_messages` returned the following error messages
127+
# hash:
128+
#
129+
# {password: ["too_short", "format"]}
130+
#
131+
# Then to add data to the validation error `validation_error_metadata`
132+
# could return:
133+
#
134+
# {
135+
# password: {
136+
# "too_short": {"minimum_length" => 6},
137+
# "format": {"requirement" => "must contain letters and numbers"}
138+
# }
139+
# }
140+
#
141+
# The specified metadata is then be merged into the validation error
142+
# object.
143+
def validation_error_metadata
144+
{}
145+
end
146+
124147
# Override this to return resource level meta data
125148
# must return a hash, and if the hash is empty the meta section will not be serialized with the resource
126149
# 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)