Skip to content

Commit 4eb7951

Browse files
author
Lee Richmond
committed
Add nested validations to response
1 parent 4838ef2 commit 4eb7951

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

lib/jsonapi_errorable/serializers/validation.rb

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,33 @@ module Serializers
33
class Validation
44
attr_reader :object
55

6-
def initialize(object)
6+
def initialize(object, relationship_params, relationship_message = {})
77
@object = object
8+
@relationship_params = relationship_params || {}
9+
@relationship_message = relationship_message
810
end
911

1012
def errors
11-
object.errors.to_hash.map do |attribute, messages|
13+
return [] unless object.respond_to?(:errors)
14+
15+
all_errors = object.errors.to_hash.map do |attribute, messages|
1216
messages.map do |message|
17+
meta = { attribute: attribute, message: message }.merge(@relationship_message)
18+
meta = { relationship: meta } if @relationship_message.present?
1319
{
1420
code: 'unprocessable_entity',
1521
status: '422',
1622
title: 'Validation Error',
1723
detail: "#{attribute.capitalize} #{message}",
1824
source: { pointer: pointer_for(object, attribute) },
19-
meta: { attribute: attribute, message: message }
25+
meta: meta
2026
}
2127
end
2228
end.flatten
29+
all_errors << relationship_errors(@relationship_params)
30+
all_errors.flatten!
31+
all_errors.compact!
32+
all_errors
2333
end
2434

2535
def relationship?(name)
@@ -49,6 +59,28 @@ def pointer_for(object, name)
4959
def activerecord?
5060
object.is_a?(ActiveRecord::Base)
5161
end
62+
63+
def relationship_errors(relationship_params)
64+
errors = []
65+
relationship_params.each_pair do |name, payload|
66+
related = Array(@object.send(name))
67+
related.each do |r|
68+
if payload.is_a?(Array)
69+
related_payload = payload.find { |p| p[:meta][:temp_id] === r.instance_variable_get(:@_jsonapi_temp_id) || p[:meta][:id] == r.id }
70+
else
71+
related_payload = payload
72+
end
73+
relationship_message = {
74+
name: name,
75+
id: r.id,
76+
:'temp-id' => r.instance_variable_get(:@_jsonapi_temp_id)
77+
}
78+
79+
errors << Validation.new(r, related_payload[:relationships], relationship_message).errors
80+
end
81+
end
82+
errors
83+
end
5284
end
5385
end
5486
end

lib/jsonapi_errorable/validatable.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
module JsonapiErrorable
22
module Validatable
33
def render_errors_for(record)
4-
validation = Serializers::Validation.new(record)
4+
validation = Serializers::Validation.new \
5+
record, deserialized_params.relationships
56

67
render \
7-
json: validation.errors,
8+
json: { errors: validation.errors },
89
status: :unprocessable_entity
910
end
1011
end

0 commit comments

Comments
 (0)