File tree 3 files changed +52
-4
lines changed 3 files changed +52
-4
lines changed Original file line number Diff line number Diff line change
1
+ module JSONAPI
2
+ module Rails
3
+ class ActiveModelError
4
+ def initialize ( field , message , source )
5
+ @field = field
6
+ @message = message
7
+ @source = source
8
+
9
+ freeze
10
+ end
11
+
12
+ def as_jsonapi
13
+ { } . tap do |hash |
14
+ hash [ :detail ] = @message
15
+ hash [ :title ] = "Invalid #{ @field } " unless @field . nil?
16
+ hash [ :source ] = { pointer : @source } unless @source . nil?
17
+ end
18
+ end
19
+ end
20
+
21
+ class ActiveModelErrors
22
+ def initialize ( errors , reverse_mapping )
23
+ @errors = errors
24
+ @reverse_mapping = reverse_mapping
25
+
26
+ freeze
27
+ end
28
+
29
+ def to_a
30
+ @errors . keys . flat_map do |key |
31
+ @errors . full_messages_for ( key ) . map do |message |
32
+ ActiveModelError . new ( key , message , @reverse_mapping [ key ] )
33
+ end
34
+ end
35
+ end
36
+ alias to_array to_a
37
+ end
38
+ end
39
+ end
Original file line number Diff line number Diff line change @@ -11,8 +11,8 @@ class Railtie < ::Rails::Railtie
11
11
MEDIA_TYPE = 'application/vnd.api+json' . freeze
12
12
PARSER = JSONAPI ::Rails . parser
13
13
RENDERERS = {
14
- jsonapi : JSONAPI ::Rails . rails_renderer ( SuccessRenderer ) ,
15
- jsonapi_error : JSONAPI ::Rails . rails_renderer ( ErrorRenderer )
14
+ jsonapi : JSONAPI ::Rails . rails_renderer ( SuccessRenderer ) ,
15
+ jsonapi_errors : JSONAPI ::Rails . rails_renderer ( ErrorsRenderer )
16
16
} . freeze
17
17
18
18
initializer 'jsonapi-rails.action_controller' do
Original file line number Diff line number Diff line change
1
+ require 'jsonapi/rails/active_model_errors'
1
2
require 'jsonapi/serializable/renderer'
2
3
3
4
module JSONAPI
@@ -16,9 +17,17 @@ def self.render(resources, options)
16
17
end
17
18
end
18
19
19
- class ErrorRenderer
20
+ class ErrorsRenderer
20
21
def self . render ( errors , options )
21
- # TODO(beauby): SerializableError inference on AR validation errors.
22
+ errors = [ errors ] unless errors . is_a? ( Array )
23
+ errors = errors . flat_map do |error |
24
+ if error . is_a? ( ActiveModel ::Errors )
25
+ ActiveModelErrors . new ( error , options [ :_reverse_mapping ] ) . to_a
26
+ else
27
+ error
28
+ end
29
+ end
30
+
22
31
JSONAPI ::Serializable ::ErrorRenderer . render ( errors , options )
23
32
end
24
33
end
You can’t perform that action at this time.
0 commit comments