Skip to content

Commit 0c31405

Browse files
committed
fixes #909 add possibility to set generic validation error
1 parent 8314445 commit 0c31405

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

lib/jsonapi/exceptions.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,11 +465,12 @@ def errors
465465
end
466466

467467
class ValidationErrors < Error
468-
attr_reader :error_messages, :error_metadata, :resource_relationships
468+
attr_reader :error_messages, :error_metadata, :resource_relationships, :resource_class
469469

470470
def initialize(resource, error_object_overrides = {})
471471
@error_messages = resource.model_error_messages
472472
@error_metadata = resource.validation_error_metadata
473+
@resource_class = resource.class
473474
@resource_relationships = resource.class._relationships.keys
474475
@key_formatter = JSONAPI.configuration.key_formatter
475476
super(error_object_overrides)
@@ -491,7 +492,7 @@ def json_api_error(attr_key, message)
491492
create_error_object(code: JSONAPI::VALIDATION_ERROR,
492493
status: :unprocessable_entity,
493494
title: message,
494-
detail: "#{format_key(attr_key)} - #{message}",
495+
detail: detail(attr_key, message),
495496
source: { pointer: pointer(attr_key) },
496497
meta: metadata_for(attr_key, message))
497498
end
@@ -501,14 +502,23 @@ def metadata_for(attr_key, message)
501502
error_metadata[attr_key] ? error_metadata[attr_key][message] : nil
502503
end
503504

505+
def detail(attr_key, message)
506+
general_error?(attr_key) ? message : "#{format_key(attr_key)} - #{message}"
507+
end
508+
504509
def pointer(attr_or_relationship_name)
510+
return '/data' if general_error?(attr_or_relationship_name)
505511
formatted_attr_or_relationship_name = format_key(attr_or_relationship_name)
506512
if resource_relationships.include?(attr_or_relationship_name)
507513
"/data/relationships/#{formatted_attr_or_relationship_name}"
508514
else
509515
"/data/attributes/#{formatted_attr_or_relationship_name}"
510516
end
511517
end
518+
519+
def general_error?(attr_key)
520+
attr_key.to_sym == :base && !resource_class._has_attribute?(attr_key)
521+
end
512522
end
513523

514524
class SaveFailed < Error

lib/jsonapi/resource.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,10 @@ def _attribute_delegated_name(attr)
837837
@_attributes.fetch(attr.to_sym, {}).fetch(:delegate, attr)
838838
end
839839

840+
def _has_attribute?(attr)
841+
@_attributes.keys.include?(attr.to_sym)
842+
end
843+
840844
def _updatable_attributes
841845
_attributes.map { |key, options| key unless options[:readonly] }.compact
842846
end

0 commit comments

Comments
 (0)