File tree Expand file tree Collapse file tree 4 files changed +43
-7
lines changed Expand file tree Collapse file tree 4 files changed +43
-7
lines changed Original file line number Diff line number Diff line change 1
1
source 'https://rubygems.org'
2
2
3
+ gem 'jsonapi-deserializable' , '0.1.1.beta3' ,
4
+ github : 'jsonapi-rb/deserializable' , branch : 'reverse-mapping'
5
+
3
6
gemspec
Original file line number Diff line number Diff line change @@ -7,6 +7,17 @@ module ActionController
7
7
def self . included ( base )
8
8
base . class_eval do
9
9
extend ClassMethods
10
+ prepend InstanceMethods
11
+ end
12
+ end
13
+
14
+ module InstanceMethods
15
+ def render ( opts = { } )
16
+ if opts . key? ( :jsonapi_error )
17
+ mapping = params . to_unsafe_h [ :_jsonapi_mapping ]
18
+ opts = opts . merge ( _jsonapi_mapping : mapping )
19
+ end
20
+ super ( opts )
10
21
end
11
22
end
12
23
@@ -42,16 +53,23 @@ def call(env)
42
53
request = Rack ::Request . new ( env )
43
54
body = request . params . slice ( *JSONAPI_KEYS )
44
55
parser . parse! ( body )
45
- deserialized_hash = @deserializable_class . call ( body )
56
+ deserialize! ( request , body )
57
+
58
+ @app . call ( env )
59
+ end
60
+
61
+ def deserialize! ( request , body )
62
+ deserialized = @deserializable_class . new ( body )
63
+ deserialized_hash = deserialized . to_h
64
+ mapping = deserialized . mapping
46
65
jsonapi = { }
47
66
JSONAPI_KEYS . each do |key |
48
67
next unless request . params . key? ( key )
49
68
jsonapi [ key . to_sym ] = request . delete_param ( key )
50
69
end
51
70
request . update_param ( :_jsonapi , jsonapi )
71
+ request . update_param ( :_jsonapi_mapping , mapping )
52
72
request . update_param ( @deserializable_key , deserialized_hash )
53
-
54
- @app . call ( env )
55
73
end
56
74
end
57
75
Original file line number Diff line number Diff line change 2
2
require 'action_controller'
3
3
require 'active_support'
4
4
5
- require 'jsonapi/rails/parser'
6
- require 'jsonapi/rails/renderer'
7
-
8
5
module JSONAPI
9
6
module Rails
10
7
class Railtie < ::Rails ::Railtie
11
8
MEDIA_TYPE = 'application/vnd.api+json' . freeze
9
+ require 'jsonapi/rails/parser'
12
10
PARSER = JSONAPI ::Rails . parser
13
11
14
12
initializer 'jsonapi-rails.action_controller' do
@@ -23,6 +21,7 @@ class Railtie < ::Rails::Railtie
23
21
::ActionDispatch ::ParamsParser ::DEFAULT_PARSERS [ Mime [ :jsonapi ] ] = PARSER
24
22
end
25
23
24
+ require 'jsonapi/rails/renderer'
26
25
::ActionController ::Renderers . add :jsonapi do |json , options |
27
26
unless json . is_a? ( String )
28
27
json = JSONAPI ::Rails ::Renderer . render ( json , options )
Original file line number Diff line number Diff line change @@ -18,9 +18,25 @@ def self.render(resources, options)
18
18
19
19
class ErrorRenderer
20
20
def self . render ( errors , options )
21
- # TODO(beauby): SerializableError inference on AR validation errors.
21
+ if errors . is_a? ( ActiveModel ::Errors )
22
+ errors = build_active_model_errors ( errors , options [ :_jsonapi_mapping ] )
23
+ end
22
24
JSONAPI ::Serializable ::ErrorRenderer . render ( errors , options )
23
25
end
26
+
27
+ def self . build_active_model_errors ( errors , mapping )
28
+ error_class = Class . new ( JSONAPI ::Serializable ::Error ) do
29
+ detail { @detail }
30
+ source do
31
+ path , name = @attribute
32
+ pointer "#{ path } /#{ name } "
33
+ end
34
+ end
35
+ errors . map! do |attr , error |
36
+ attr = mapping [ attr ]
37
+ error_class . new ( attribute : attr , detail : error )
38
+ end
39
+ end
24
40
end
25
41
end
26
42
end
You can’t perform that action at this time.
0 commit comments