Skip to content

Commit 1484f93

Browse files
committed
Add controller DSL for deserialization.
1 parent aebdb55 commit 1484f93

File tree

3 files changed

+67
-3
lines changed

3 files changed

+67
-3
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
require 'jsonapi/deserializable'
2+
require 'jsonapi/parser'
3+
4+
module JSONAPI
5+
module Rails
6+
module ActionController
7+
def self.included(base)
8+
base.class_eval do
9+
extend ClassMethods
10+
prepend InstanceMethods
11+
end
12+
end
13+
14+
module ClassMethods
15+
def deserializable_resource(key, klass = nil, &block)
16+
if klass.nil?
17+
klass = Class.new(JSONAPI::Deserializable::Resource, &block)
18+
end
19+
@deserializable_key = key
20+
@deserializable_class = klass
21+
@deserializable_parser = JSONAPI::Parser::Resource
22+
end
23+
24+
def deserializable_relationship(key, klass = nil, &block)
25+
if klass.nil?
26+
klass = Class.new(JSONAPI::Deserializable::Relationship, &block)
27+
end
28+
@deserializable_key = key
29+
@deserializable_class = klass
30+
@deserializable_parser = JSONAPI::Parser::Relationship
31+
end
32+
33+
def deserializable_class
34+
@deserializable_class
35+
end
36+
37+
def deserializable_key
38+
@deserializable_key
39+
end
40+
41+
def deserializable_parser
42+
@deserializable_parser
43+
end
44+
end
45+
46+
module InstanceMethods
47+
def params
48+
params = super
49+
key = self.class.deserializable_key
50+
return params if body.key?(key)
51+
parser = self.class.deserializable_parser
52+
return params unless parser
53+
54+
parser.parse!(body)
55+
deserializable_class = self.class.deserializable_class
56+
57+
params.merge!(key => deserializable_class.call(params))
58+
end
59+
end
60+
end
61+
end
62+
end

lib/jsonapi/rails/parser.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
require 'jsonapi/parser'
2-
31
module JSONAPI
42
module Rails
53
module_function
64

75
def parser
86
lambda do |body|
97
data = JSON.parse(body)
10-
JSONAPI.parse_resource!(body)
118
data = { _json: data } unless data.is_a?(Hash)
129
data.with_indifferent_access
1310
end

lib/jsonapi/rails/railtie.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require 'rails/railtie'
22
require 'action_controller'
33
require 'action_controller/railtie'
4+
require 'active_support'
45

56
require 'jsonapi/rails/parser'
67
require 'jsonapi/rails/render'
@@ -36,3 +37,7 @@ class Railtie < ::Rails::Railtie
3637
end
3738
end
3839
end
40+
41+
ActiveSupport.on_load(:action_controller) do
42+
include JSONAPI::Rails::ActionController
43+
end

0 commit comments

Comments
 (0)