Skip to content

Commit 2e64896

Browse files
committed
Simplify ActiveModel::ErrorSerializer
We're only running CI for Rails 6.1+ now, and we can now rely on a stable API for ActiveModel::Errors.
1 parent bcfd9ee commit 2e64896

File tree

2 files changed

+5
-48
lines changed

2 files changed

+5
-48
lines changed

lib/jsonapi/active_model_error_serializer.rb

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,35 +12,15 @@ class ActiveModelErrorSerializer < ErrorSerializer
1212
end
1313

1414
attribute :code do |object|
15-
_, error_hash = object
16-
code = error_hash[:error] unless error_hash[:error].is_a?(Hash)
17-
code ||= error_hash[:message] || :invalid
18-
# `parameterize` separator arguments are different on Rails 4 vs 5...
19-
code.to_s.delete("''").parameterize.tr('-', '_')
15+
object.type.to_s.delete("''").parameterize.tr('-', '_')
2016
end
2117

22-
attribute :detail do |object, params|
23-
error_key, error_hash = object
24-
errors_object = params[:model].errors
25-
26-
# Rails 4 provides just the message.
27-
if error_hash[:error].present? && error_hash[:error].is_a?(Hash)
28-
message = errors_object.generate_message(
29-
error_key, nil, error_hash[:error]
30-
)
31-
elsif error_hash[:error].present?
32-
message = errors_object.generate_message(
33-
error_key, error_hash[:error], error_hash
34-
)
35-
else
36-
message = error_hash[:message]
37-
end
38-
39-
errors_object.full_message(error_key, message)
18+
attribute :detail do |object, _params|
19+
object.full_message
4020
end
4121

4222
attribute :source do |object, params|
43-
error_key, _ = object
23+
error_key = object.attribute
4424
model_serializer = params[:model_serializer]
4525
attrs = (model_serializer.attributes_to_serialize || {}).keys
4626
rels = (model_serializer.relationships_to_serialize || {}).keys

lib/jsonapi/rails.rb

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ def self.add_errors_renderer!
4646
JSONAPI::ErrorSerializer.new(resource, options)
4747
) unless resource.is_a?(ActiveModel::Errors)
4848

49-
errors = []
5049
model = resource.instance_variable_get(:@base)
5150

5251
if respond_to?(:jsonapi_serializer_class, true)
@@ -55,31 +54,9 @@ def self.add_errors_renderer!
5554
model_serializer = JSONAPI::Rails.serializer_class(model, false)
5655
end
5756

58-
details = {}
59-
if ::Rails.gem_version >= Gem::Version.new('6.1')
60-
resource.each do |error|
61-
attr = error.attribute
62-
details[attr] ||= []
63-
details[attr] << error.detail.merge(message: error.message)
64-
end
65-
elsif resource.respond_to?(:details)
66-
details = resource.details
67-
else
68-
details = resource.messages
69-
end
70-
71-
details.each do |error_key, error_hashes|
72-
error_hashes.each do |error_hash|
73-
# Rails 4 provides just the message.
74-
error_hash = { message: error_hash } unless error_hash.is_a?(Hash)
75-
76-
errors << [ error_key, error_hash ]
77-
end
78-
end
79-
8057
JSONAPI::Rails.serializer_to_json(
8158
JSONAPI::ActiveModelErrorSerializer.new(
82-
errors, params: { model: model, model_serializer: model_serializer }
59+
resource.errors, params: { model: model, model_serializer: model_serializer }
8360
)
8461
)
8562
end

0 commit comments

Comments
 (0)