diff --git a/lib/jsonapi/rails/action_controller.rb b/lib/jsonapi/rails/action_controller.rb index 8f8ffbc..d3b1aab 100644 --- a/lib/jsonapi/rails/action_controller.rb +++ b/lib/jsonapi/rails/action_controller.rb @@ -4,9 +4,11 @@ module JSONAPI module Rails module ActionController - REVERSE_MAPPING_KEY = 'jsonapi_deserializable.reverse_mapping'.freeze + extend ActiveSupport::Concern - module ClassMethods + JSONAPI_POINTERS_KEY = 'jsonapi_deserializable.jsonapi_pointers'.freeze + + class_methods do def deserializable_resource(key, options = {}, &block) _deserializable(key, options, JSONAPI::Deserializable::Resource, &block) @@ -24,12 +26,18 @@ def _deserializable(key, options, fallback, &block) before_action(options) do |controller| resource = klass.new(controller.params[:_jsonapi].to_unsafe_hash) - controller.request.env[REVERSE_MAPPING_KEY] = + controller.request.env[JSONAPI_POINTERS_KEY] = resource.reverse_mapping controller.params[key.to_sym] = resource.to_hash end end end + + private + + def jsonapi_pointers + request.env[JSONAPI_POINTERS_KEY] + end end end end diff --git a/lib/jsonapi/rails/railtie.rb b/lib/jsonapi/rails/railtie.rb index 2ac26e4..b37d523 100644 --- a/lib/jsonapi/rails/railtie.rb +++ b/lib/jsonapi/rails/railtie.rb @@ -17,7 +17,7 @@ class Railtie < ::Rails::Railtie initializer 'jsonapi-rails.action_controller' do ActiveSupport.on_load(:action_controller) do require 'jsonapi/rails/action_controller' - extend ::JSONAPI::Rails::ActionController::ClassMethods + include ::JSONAPI::Rails::ActionController Mime::Type.register MEDIA_TYPE, :jsonapi @@ -35,9 +35,8 @@ class Railtie < ::Rails::Railtie ::ActionController::Renderers.add(:jsonapi_error) do |errors, 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) + # has access to the jsonapi_pointers method. + options = options.merge(_jsonapi_pointers: jsonapi_pointers) self.content_type ||= Mime[:jsonapi] RENDERERS[:jsonapi_error].render(errors, options).to_json diff --git a/spec/action_controller_spec.rb b/spec/action_controller_spec.rb new file mode 100644 index 0000000..bd608cd --- /dev/null +++ b/spec/action_controller_spec.rb @@ -0,0 +1,17 @@ +require 'rails_helper' + +RSpec.describe ActionController::Base do + it 'exposes the deserialization mapping via the jsonapi_pointers method' do + pointers = { id: '/data/id', type: '/data/type' } + + allow(subject).to receive(:request) do + OpenStruct.new( + env: { + JSONAPI::Rails::ActionController::JSONAPI_POINTERS_KEY => pointers + } + ) + end + + expect(subject.send(:jsonapi_pointers)).to equal pointers + end +end