File tree Expand file tree Collapse file tree 2 files changed +32
-7
lines changed Expand file tree Collapse file tree 2 files changed +32
-7
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments