Skip to content

Commit fe9c5a9

Browse files
johvetTate Thurston
authored andcommitted
Make error handling consistent for Rails 5+ and 6+
1 parent 7f9c328 commit fe9c5a9

File tree

4 files changed

+21
-13
lines changed

4 files changed

+21
-13
lines changed

lib/jsonapi/active_model_error_serializer.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ def status_code(params)
5050
message = errors_object.generate_message(
5151
error_key, nil, error_hash[:error]
5252
)
53-
elsif error_hash[:error].present?
53+
elsif error_hash[:error].present? && error_hash[:error].is_a?(Symbol)
5454
message = errors_object.generate_message(
5555
error_key, error_hash[:error], error_hash
5656
)
5757
else
58-
message = error_hash[:message]
58+
message = error_hash[:message] || error_hash[:error]
5959
end
6060

6161
errors_object.full_message(error_key, message)

lib/jsonapi/rails.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,21 @@ def self.add_errors_renderer!
6262
details[attr] ||= []
6363
details[attr] << error.detail.merge(message: error.message)
6464
end
65-
elsif resource.respond_to?(:details)
66-
details = resource.details
65+
elsif resource.respond_to?(:details) && resource.respond_to?(:messages)
66+
resource.details.each do |attr, problems|
67+
problems.each_with_index do |error, index|
68+
details[attr] ||= []
69+
70+
if error[:error].is_a?(Hash)
71+
current = error[:error].dup
72+
current[:error] ||= :invalid
73+
74+
details[attr] << current
75+
else
76+
details[attr] << error.merge(message: resource.messages[attr][index])
77+
end
78+
end
79+
end
6780
else
6881
details = resource.messages
6982
end

spec/dummy.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def self.ransackable_attributes(auth_object = nil)
5757

5858
# Provide a validation adding an error to the model's base
5959
def title_check
60-
errors.add(:base, :invalid) if title == 'n/a'
60+
errors.add(:base, :model_invalid, errors: 'The record has an unacceptable title.') if title == 'n/a'
6161
end
6262

6363
def deletable?

spec/errors_spec.rb

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,8 @@
6161
.to eq(Rack::Utils::HTTP_STATUS_CODES[422])
6262
expect(response_json['errors'][0]['source'])
6363
.to eq('pointer' => '/data/relationships/user')
64-
if Rails.gem_version >= Gem::Version.new('6.1')
65-
expect(response_json['errors'][0]['detail'])
66-
.to eq('User must exist')
67-
else
68-
expect(response_json['errors'][0]['detail'])
69-
.to eq('User can\'t be blank')
70-
end
64+
expect(response_json['errors'][0]['detail'])
65+
.to eq('User must exist')
7166
end
7267

7368
context 'required by validations' do
@@ -156,7 +151,7 @@
156151
expect(response_json['errors'][0]['source'])
157152
.to eq('pointer' => '/data')
158153
expect(response_json['errors'][0]['detail'])
159-
.to eq('is invalid')
154+
.to eq('Validation failed: The record has an unacceptable title.')
160155
end
161156
end
162157
end

0 commit comments

Comments
 (0)