Skip to content

Commit 870a7f0

Browse files
coffeejunkstas
authored andcommitted
Handle Rails 6.1 ActiveModel::Error#detail
Starting with Rails 6.1 ActiveModel::Error is an actual class: > Active Model's errors are now objects with an interface that allows > your application to more easily handle and interact with errors thrown > by models. The feature[1] includes a query interface, enables more > precise testing, and access to error details. > > [1] rails/rails#32313 As a result of this `resource.details` looks slightly different than in previous versions and notably doesn't contain `:message` anymore, if `object.errors.add(:something, message: 'some error')` was used to specify a validation error. https://github.com/rails/rails/blob/2a7ff0a5f54979b14b19f827c99295297dda411d/activemodel/lib/active_model/error.rb#L149 From the test suite: ``` note.errors.add(:title, message: 'has typos') if note.errors.key?(:title) ``` Rails 6.0: ``` { :title=>[{:error=>:invalid, :value=>"BAD_TITLE"}, {:error=>{:message=>"has typos"}}], :quantity=>[{:error=>:less_than, :value=>109, :count=>100}] } ``` Rails 6.1: ``` { :title=>[{:error=>:invalid, :value=>"BAD_TITLE"}, {:error=>:invalid}], :quantity=>[{:error=>:less_than, :value=>100, :count=>100}] } ``` The patch addresses this change by merging the error.message into its detail.
1 parent f107416 commit 870a7f0

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

lib/jsonapi/rails.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,18 @@ def self.add_errors_renderer!
5555
model_serializer = JSONAPI::Rails.serializer_class(model, false)
5656
end
5757

58-
details = resource.messages
59-
details = resource.details if resource.respond_to?(:details)
58+
details = {}
59+
if ::Rails::VERSION::MAJOR >= 6 && ::Rails::VERSION::MINOR >= 1
60+
resource.map 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
6070

6171
details.each do |error_key, error_hashes|
6272
error_hashes.each do |error_hash|

0 commit comments

Comments
 (0)