Skip to content

Commit 0142f56

Browse files
committed
support "code" attribute of error messages
- added to errors as symbols - can be mapped with i18n by clients
1 parent 2c7493c commit 0142f56

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

lib/json_api_client/resource.rb

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -411,11 +411,7 @@ def save
411411

412412
if last_result_set.has_errors?
413413
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
414+
add_error(error)
419415
end
420416
false
421417
else
@@ -450,6 +446,20 @@ def inspect
450446

451447
protected
452448

449+
def add_error(error)
450+
if error.source_parameter
451+
error_attribute = self.class.key_formatter.unformat(error.source_parameter)
452+
453+
if error.code && respond_to?(error_attribute)
454+
errors.add(error_attribute, error.code.to_sym)
455+
else
456+
errors.add(error_attribute, error.title || error.detail)
457+
end
458+
else
459+
errors.add(:base, error.title || error.detail)
460+
end
461+
end
462+
453463
def method_missing(method, *args)
454464
association = association_for(method)
455465

test/unit/server_side_error_test.rb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,27 @@ def test_can_handle_key_formatted_attribute_validation_strings
3838
.to_return(headers: {content_type: "application/vnd.api+json"}, body: {
3939
errors: [{source: {pointer: "/data/attributes/email-address"}, title: "Email address is invalid"}]
4040
}.to_json)
41-
41+
4242
user = User.create(name: 'Bob', email_address: 'invalid email')
4343
assert !user.persisted?
4444
assert user.errors.present?
4545
assert_equal ["Email address is invalid"], user.errors[:email_address]
4646
end
4747
end
4848

49-
end
49+
def test_can_handle_key_formatted_attribute_validation_codes
50+
with_altered_config(User, :json_key_format => :dasherized_key) do
51+
stub_request(:post, "http://example.com/users")
52+
.to_return(headers: {content_type: "application/vnd.api+json"}, body: {
53+
errors: [{source: {pointer: "/data/attributes/email-address"}, title: "Email address is invalid", code: "invalid"}]
54+
}.to_json)
55+
56+
user = User.create(name: 'Bob', email_address: 'invalid email')
57+
assert !user.persisted?
58+
assert user.errors.present?
59+
assert_equal ["is invalid"], user.errors[:email_address]
60+
assert_equal [{error: :invalid}], user.errors.details[:email_address] if user.errors.respond_to?(:details)
61+
end
62+
end
63+
64+
end

0 commit comments

Comments
 (0)