Skip to content

Commit c84e751

Browse files
x4d3chingor13
authored andcommitted
Add error details to resource when destroy fails (#275)
* Add error details to resource when destroy fails * Simplify code by using last_result_set field
1 parent 960cc34 commit c84e751

File tree

2 files changed

+27
-17
lines changed

2 files changed

+27
-17
lines changed

lib/json_api_client/resource.rb

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -410,13 +410,7 @@ def save
410410
end
411411

412412
if last_result_set.has_errors?
413-
last_result_set.errors.each do |error|
414-
if error.source_parameter
415-
errors.add(self.class.key_formatter.unformat(error.source_parameter), error.title || error.detail)
416-
else
417-
errors.add(:base, error.title || error.detail)
418-
end
419-
end
413+
fill_errors
420414
false
421415
else
422416
self.errors.clear if self.errors
@@ -436,11 +430,12 @@ def save
436430
# @return [Boolean] Whether or not the destroy succeeded
437431
def destroy
438432
self.last_result_set = self.class.requestor.destroy(self)
439-
if !last_result_set.has_errors?
433+
if last_result_set.has_errors?
434+
fill_errors
435+
false
436+
else
440437
self.attributes.clear
441438
true
442-
else
443-
false
444439
end
445440
end
446441

@@ -504,5 +499,15 @@ def attributes_for_serialization
504499
def relationships_for_serialization
505500
relationships.as_json_api
506501
end
502+
503+
def fill_errors
504+
last_result_set.errors.each do |error|
505+
if error.source_parameter
506+
errors.add(self.class.key_formatter.unformat(error.source_parameter), error.title || error.detail)
507+
else
508+
errors.add(:base, error.title || error.detail)
509+
end
510+
end
511+
end
507512
end
508513
end

test/unit/destroying_test.rb

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,23 @@ def test_destroy_failure
4343
assert(user.persisted?)
4444

4545
stub_request(:delete, "http://example.com/users/1")
46-
.to_return(headers: {content_type: "application/json"}, body: {
46+
.to_return(headers: { content_type: "application/json" }, body: {
4747
data: [],
48-
errors: [{
49-
status: 400,
50-
errors: [
51-
{title: "Some failure message"}
52-
]
53-
}]
48+
errors: [
49+
{
50+
status: 400,
51+
title: "Some failure message",
52+
source: {
53+
pointer: "/data/attributes/email_address"
54+
}
55+
}
56+
]
5457
}.to_json)
5558

5659
assert_equal(false, user.destroy, "failed deletion should return falsy value")
5760
assert_equal(true, user.persisted?, "user should still be persisted because destroy failed")
61+
assert(user.errors.present?)
62+
assert_equal("Some failure message", user.errors.messages[:email_address].first, "user should contain the errors describing the failure")
5863
end
5964

6065
def test_callbacks

0 commit comments

Comments
 (0)