From 260e20b84f48d661c17d0a3c09e72cdbb82d4824 Mon Sep 17 00:00:00 2001 From: smaximov Date: Tue, 23 May 2017 19:20:01 +0300 Subject: [PATCH 1/3] Provide :_reverse_mapping in the renderer proc --- lib/jsonapi/rails/action_controller.rb | 6 ------ lib/jsonapi/rails/renderer.rb | 2 ++ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/jsonapi/rails/action_controller.rb b/lib/jsonapi/rails/action_controller.rb index e4938c4..8a4cde5 100644 --- a/lib/jsonapi/rails/action_controller.rb +++ b/lib/jsonapi/rails/action_controller.rb @@ -11,12 +11,6 @@ def self.prepended(base) extend ClassMethods end end - - def render(options = {}) - reverse_mapping = request.env[REVERSE_MAPPING_KEY] - super(options.merge(_reverse_mapping: reverse_mapping)) - end - module ClassMethods def deserializable_resource(key, options = {}, &block) _deserializable(key, options, diff --git a/lib/jsonapi/rails/renderer.rb b/lib/jsonapi/rails/renderer.rb index 6e15aa3..cf18d0c 100644 --- a/lib/jsonapi/rails/renderer.rb +++ b/lib/jsonapi/rails/renderer.rb @@ -28,6 +28,8 @@ def self.render(errors, options) # @api private def rails_renderer(renderer) proc do |json, options| + reverse_mapping = request.env[ActionController::REVERSE_MAPPING_KEY] + options = options.merge(_reverse_mapping: reverse_mapping) json = renderer.render(json, options) unless json.is_a?(String) self.content_type ||= Mime[:jsonapi] self.response_body = json From 3f98732fdf36c078363e8a3a806c06d370be22a1 Mon Sep 17 00:00:00 2001 From: smaximov Date: Tue, 23 May 2017 19:24:30 +0300 Subject: [PATCH 2/3] Directly extend ActionController with class methods --- lib/jsonapi/rails/action_controller.rb | 5 ----- lib/jsonapi/rails/railtie.rb | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/jsonapi/rails/action_controller.rb b/lib/jsonapi/rails/action_controller.rb index 8a4cde5..8f7eea2 100644 --- a/lib/jsonapi/rails/action_controller.rb +++ b/lib/jsonapi/rails/action_controller.rb @@ -6,11 +6,6 @@ module Rails module ActionController REVERSE_MAPPING_KEY = 'jsonapi_deserializable.reverse_mapping'.freeze - def self.prepended(base) - base.class_eval do - extend ClassMethods - end - end module ClassMethods def deserializable_resource(key, options = {}, &block) _deserializable(key, options, diff --git a/lib/jsonapi/rails/railtie.rb b/lib/jsonapi/rails/railtie.rb index 9a25076..f27dfac 100644 --- a/lib/jsonapi/rails/railtie.rb +++ b/lib/jsonapi/rails/railtie.rb @@ -18,7 +18,7 @@ class Railtie < ::Rails::Railtie initializer 'jsonapi-rails.action_controller' do ActiveSupport.on_load(:action_controller) do require 'jsonapi/rails/action_controller' - prepend ::JSONAPI::Rails::ActionController + extend ::JSONAPI::Rails::ActionController::ClassMethods Mime::Type.register MEDIA_TYPE, :jsonapi From f9a4a562b91d1779d244aaf0267f7b197fac4dcd Mon Sep 17 00:00:00 2001 From: Sergei Maximov Date: Thu, 25 May 2017 21:52:00 +0300 Subject: [PATCH 3/3] Add a note stating that the proc is evaluated in the controller context --- lib/jsonapi/rails/renderer.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/jsonapi/rails/renderer.rb b/lib/jsonapi/rails/renderer.rb index cf18d0c..ecfb83f 100644 --- a/lib/jsonapi/rails/renderer.rb +++ b/lib/jsonapi/rails/renderer.rb @@ -28,6 +28,8 @@ def self.render(errors, options) # @api private def rails_renderer(renderer) proc do |json, options| + # Renderer proc is evaluated in the controller context, so it + # has access to the request object. reverse_mapping = request.env[ActionController::REVERSE_MAPPING_KEY] options = options.merge(_reverse_mapping: reverse_mapping) json = renderer.render(json, options) unless json.is_a?(String)