diff --git a/lib/jsonapi_errorable/serializers/validation.rb b/lib/jsonapi_errorable/serializers/validation.rb index a401826..5002492 100644 --- a/lib/jsonapi_errorable/serializers/validation.rb +++ b/lib/jsonapi_errorable/serializers/validation.rb @@ -16,11 +16,18 @@ def errors messages.map do |message| meta = { attribute: attribute, message: message }.merge(@relationship_message) meta = { relationship: meta } if @relationship_message.present? + + detail = "#{attribute.capitalize} #{message}" + + if attribute.to_s.downcase == 'base' + detail = message + end + { code: 'unprocessable_entity', status: '422', title: 'Validation Error', - detail: "#{attribute.capitalize} #{message}", + detail: detail, source: { pointer: pointer_for(object, attribute) }, meta: meta } diff --git a/spec/serializers/serializable_validation_spec.rb b/spec/serializers/serializable_validation_spec.rb index 20c4a0a..003a2dc 100644 --- a/spec/serializers/serializable_validation_spec.rb +++ b/spec/serializers/serializable_validation_spec.rb @@ -43,6 +43,32 @@ ] ) end + + context 'when the error attribute is "base"' do + let(:errors_hash) { { base: ["Model is invalid"] } } + + before do + allow(object).to receive(:respond_to?).with(:base) { true } + end + + it 'should not render the attribute in the message detail' do + expect(subject).to eq( + [ + { + code: 'unprocessable_entity', + status: '422', + title: "Validation Error", + detail: "Model is invalid", + source: { pointer: '/data/attributes/base' }, + meta: { + attribute: :base, + message: "Model is invalid" + } + } + ] + ) + end + end end context 'when the error is on a relationship' do