From 259a2722b2990a3a59c29386798851e8c94ba1d5 Mon Sep 17 00:00:00 2001 From: Matthew Bass Date: Mon, 20 Jan 2025 16:34:56 -0500 Subject: [PATCH] Add meta field to error serializer Per the JSON:API spec, the meta field can optionally be included in error response objects. See https://jsonapi.org/format/#error-objects --- lib/jsonapi/error_serializer.rb | 2 +- spec/errors_spec.rb | 27 ++++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/jsonapi/error_serializer.rb b/lib/jsonapi/error_serializer.rb index cb384fa..3b6e10f 100644 --- a/lib/jsonapi/error_serializer.rb +++ b/lib/jsonapi/error_serializer.rb @@ -8,7 +8,7 @@ class ErrorSerializer set_type :error # Object/Hash attribute helpers. - [:status, :source, :title, :detail, :code].each do |attr_name| + [:status, :source, :title, :detail, :code, :meta].each do |attr_name| attribute attr_name do |object| object.try(attr_name) || object.try(:fetch, attr_name, nil) end diff --git a/spec/errors_spec.rb b/spec/errors_spec.rb index a704a63..e35d4f4 100644 --- a/spec/errors_spec.rb +++ b/spec/errors_spec.rb @@ -38,7 +38,8 @@ 'source' => { 'pointer' => '' }, 'title' => 'Unprocessable Entity', 'detail' => nil, - 'code' => nil + 'code' => nil, + 'meta' => nil } ) end @@ -65,7 +66,8 @@ 'source' => { 'pointer' => '/data/relationships/user' }, 'title' => 'Unprocessable Entity', 'detail' => expected_detail, - 'code' => 'blank' + 'code' => 'blank', + 'meta' => nil } ) end @@ -87,21 +89,24 @@ 'source' => { 'pointer' => '/data/attributes/title' }, 'title' => 'Unprocessable Entity', 'detail' => 'Title is invalid', - 'code' => 'invalid' + 'code' => 'invalid', + 'meta' => nil }, { 'status' => '422', 'source' => { 'pointer' => '/data/attributes/title' }, 'title' => 'Unprocessable Entity', 'detail' => 'Title has typos', - 'code' => 'invalid' + 'code' => 'invalid', + 'meta' => nil }, { 'status' => '422', 'source' => { 'pointer' => '/data/attributes/quantity' }, 'title' => 'Unprocessable Entity', 'detail' => 'Quantity must be less than 100', - 'code' => 'less_than' + 'code' => 'less_than', + 'meta' => nil } ) end @@ -123,7 +128,8 @@ 'source' => { 'pointer' => '' }, 'title' => 'Unprocessable Entity', 'detail' => 'Title has slurs', - 'code' => 'title_has_slurs' + 'code' => 'title_has_slurs', + 'meta' => nil } ) end @@ -146,7 +152,8 @@ 'source' => { 'pointer' => '/data/attributes/title' }, 'title' => 'Unprocessable Entity', 'detail' => nil, - 'code' => nil + 'code' => nil, + 'meta' => nil } ) end @@ -166,7 +173,8 @@ 'source' => nil, 'title' => 'Not Found', 'detail' => nil, - 'code' => nil + 'code' => nil, + 'meta' => nil } ) end @@ -185,7 +193,8 @@ 'source' => nil, 'title' => 'Internal Server Error', 'detail' => nil, - 'code' => nil + 'code' => nil, + 'meta' => nil } ) end