Skip to content

Commit 927f030

Browse files
authored
Update jsonapi-rb to v0.2.1. (#32)
* Update jsonapi-rb to v0.2.1. * Refactor renderers.
1 parent 0f469ca commit 927f030

File tree

3 files changed

+33
-24
lines changed

3 files changed

+33
-24
lines changed

jsonapi-rails.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
1414
spec.files = Dir['README.md', 'lib/**/*']
1515
spec.require_path = 'lib'
1616

17-
spec.add_dependency 'jsonapi-rb', '~> 0.1', '>= 0.1.3'
17+
spec.add_dependency 'jsonapi-rb', '~> 0.2.1'
1818

1919
spec.add_development_dependency 'rails', '~> 5.0'
2020
spec.add_development_dependency 'sqlite3'

lib/jsonapi/rails/railtie.rb

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ module Rails
1010
class Railtie < ::Rails::Railtie
1111
MEDIA_TYPE = 'application/vnd.api+json'.freeze
1212
RENDERERS = {
13-
jsonapi: JSONAPI::Rails.rails_renderer(SuccessRenderer),
14-
jsonapi_error: JSONAPI::Rails.rails_renderer(ErrorRenderer)
13+
jsonapi: SuccessRenderer.new,
14+
jsonapi_error: ErrorsRenderer.new
1515
}.freeze
1616

1717
initializer 'jsonapi-rails.action_controller' do
@@ -27,8 +27,20 @@ class Railtie < ::Rails::Railtie
2727
::ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:jsonapi]] = PARSER
2828
end
2929

30-
RENDERERS.each do |key, renderer|
31-
::ActionController::Renderers.add(key, &renderer)
30+
::ActionController::Renderers.add(:jsonapi) do |resources, options|
31+
self.content_type ||= Mime[:jsonapi]
32+
33+
RENDERERS[:jsonapi].render(resources, options).to_json
34+
end
35+
36+
::ActionController::Renderers.add(:jsonapi_error) do |errors, options|
37+
# Renderer proc is evaluated in the controller context, so it
38+
# has access to the request object.
39+
reverse_mapping = request.env[ActionController::REVERSE_MAPPING_KEY]
40+
options = options.merge(_reverse_mapping: reverse_mapping)
41+
self.content_type ||= Mime[:jsonapi]
42+
43+
RENDERERS[:jsonapi_error].render(errors, options).to_json
3244
end
3345

3446
JSONAPI::Deserializable::Resource.configure do |config|

lib/jsonapi/rails/renderer.rb

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@
33
module JSONAPI
44
module Rails
55
class SuccessRenderer
6-
def self.render(resources, options)
6+
def initialize(renderer = JSONAPI::Serializable::SuccessRenderer.new)
7+
@renderer = renderer
8+
9+
freeze
10+
end
11+
12+
def render(resources, options)
713
opts = options.dup
814
# TODO(beauby): Move this to a global configuration.
915
default_exposures = {
@@ -12,29 +18,20 @@ def self.render(resources, options)
1218
opts[:expose] = default_exposures.merge!(opts[:expose] || {})
1319
opts[:jsonapi] = opts.delete(:jsonapi_object)
1420

15-
JSONAPI::Serializable::Renderer.render(resources, opts)
21+
@renderer.render(resources, opts)
1622
end
1723
end
1824

19-
class ErrorRenderer
20-
def self.render(errors, options)
21-
# TODO(beauby): SerializableError inference on AR validation errors.
22-
JSONAPI::Serializable::ErrorRenderer.render(errors, options)
23-
end
24-
end
25+
class ErrorsRenderer
26+
def initialize(renderer = JSONAPI::Serializable::ErrorsRenderer.new)
27+
@renderer = renderer
2528

26-
module_function
29+
freeze
30+
end
2731

28-
# @api private
29-
def rails_renderer(renderer)
30-
proc do |json, options|
31-
# Renderer proc is evaluated in the controller context, so it
32-
# has access to the request object.
33-
reverse_mapping = request.env[ActionController::REVERSE_MAPPING_KEY]
34-
options = options.merge(_reverse_mapping: reverse_mapping)
35-
json = renderer.render(json, options).to_json unless json.is_a?(String)
36-
self.content_type ||= Mime[:jsonapi]
37-
self.response_body = json
32+
def render(errors, options)
33+
# TODO(beauby): SerializableError inference on AR validation errors.
34+
@renderer.render(errors, options)
3835
end
3936
end
4037
end

0 commit comments

Comments
 (0)