Skip to content

Commit bb95f67

Browse files
authored
Merge pull request #1174 from johnmosesman/release-0-9
Cherrypicks into 0.9 - fixes #909 add possibility to set generic validation error
2 parents 3707e8c + bb2f983 commit bb95f67

2 files changed

Lines changed: 16 additions & 2 deletions

File tree

lib/jsonapi/exceptions.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,11 +448,12 @@ def errors
448448
end
449449

450450
class ValidationErrors < Error
451-
attr_reader :error_messages, :error_metadata, :resource_relationships
451+
attr_reader :error_messages, :error_metadata, :resource_relationships, :resource_class
452452

453453
def initialize(resource, error_object_overrides = {})
454454
@error_messages = resource.model_error_messages
455455
@error_metadata = resource.validation_error_metadata
456+
@resource_class = resource.class
456457
@resource_relationships = resource.class._relationships.keys
457458
@key_formatter = JSONAPI.configuration.key_formatter
458459
super(error_object_overrides)
@@ -474,7 +475,7 @@ def json_api_error(attr_key, message)
474475
create_error_object(code: JSONAPI::VALIDATION_ERROR,
475476
status: :unprocessable_entity,
476477
title: message,
477-
detail: "#{format_key(attr_key)} - #{message}",
478+
detail: detail(attr_key, message),
478479
source: { pointer: pointer(attr_key) },
479480
meta: metadata_for(attr_key, message))
480481
end
@@ -484,14 +485,23 @@ def metadata_for(attr_key, message)
484485
error_metadata[attr_key] ? error_metadata[attr_key][message] : nil
485486
end
486487

488+
def detail(attr_key, message)
489+
general_error?(attr_key) ? message : "#{format_key(attr_key)} - #{message}"
490+
end
491+
487492
def pointer(attr_or_relationship_name)
493+
return '/data' if general_error?(attr_or_relationship_name)
488494
formatted_attr_or_relationship_name = format_key(attr_or_relationship_name)
489495
if resource_relationships.include?(attr_or_relationship_name)
490496
"/data/relationships/#{formatted_attr_or_relationship_name}"
491497
else
492498
"/data/attributes/#{formatted_attr_or_relationship_name}"
493499
end
494500
end
501+
502+
def general_error?(attr_key)
503+
attr_key.to_sym == :base && !resource_class._has_attribute?(attr_key)
504+
end
495505
end
496506

497507
class SaveFailed < Error

lib/jsonapi/resource.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -911,6 +911,10 @@ def _attribute_options(attr)
911911
default_attribute_options.merge(@_attributes[attr])
912912
end
913913

914+
def _has_attribute?(attr)
915+
@_attributes.keys.include?(attr.to_sym)
916+
end
917+
914918
def _updatable_relationships
915919
@_relationships.map { |key, _relationship| key }
916920
end

0 commit comments

Comments
 (0)