diff --git a/lib/jsonapi/rails/action_controller.rb b/lib/jsonapi/rails/action_controller.rb index e4938c4..8f7eea2 100644 --- a/lib/jsonapi/rails/action_controller.rb +++ b/lib/jsonapi/rails/action_controller.rb @@ -6,17 +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 - - 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/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 diff --git a/lib/jsonapi/rails/renderer.rb b/lib/jsonapi/rails/renderer.rb index 6e15aa3..ecfb83f 100644 --- a/lib/jsonapi/rails/renderer.rb +++ b/lib/jsonapi/rails/renderer.rb @@ -28,6 +28,10 @@ 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) self.content_type ||= Mime[:jsonapi] self.response_body = json