diff --git a/lib/jsonapi/rails/action_controller.rb b/lib/jsonapi/rails/action_controller.rb index e4938c4..a876e74 100644 --- a/lib/jsonapi/rails/action_controller.rb +++ b/lib/jsonapi/rails/action_controller.rb @@ -32,29 +32,13 @@ def deserializable_relationship(key, options = {}, &block) def _deserializable(key, options, fallback, &block) options = options.dup klass = options.delete(:class) || Class.new(fallback, &block) - use Deserialization, key, klass, options - end - end - class Deserialization - REQUEST_PARAMETERS_KEY = - 'action_dispatch.request.request_parameters'.freeze - def initialize(app, key, klass) - @app = app - @deserializable_key = key - @deserializable_class = klass - end - - def call(env) - request = Rack::Request.new(env) - body = JSON.parse(request.body.read) - deserializable = @deserializable_class.new(body) - env[REVERSE_MAPPING_KEY] = deserializable.reverse_mapping - (env[REQUEST_PARAMETERS_KEY] ||= {}).tap do |request_parameters| - request_parameters[@deserializable_key] = deserializable.to_hash + before_action(options) do |controller| + resource = klass.new(controller.params[:_jsonapi].to_unsafe_hash) + controller.request.env[REVERSE_MAPPING_KEY] = + resource.reverse_mapping + controller.params[key.to_sym] = resource.to_hash end - - @app.call(env) end end end diff --git a/lib/jsonapi/rails/parser.rb b/lib/jsonapi/rails/parser.rb index f6b6d52..6774559 100644 --- a/lib/jsonapi/rails/parser.rb +++ b/lib/jsonapi/rails/parser.rb @@ -1,13 +1,12 @@ +require 'jsonapi/deserializable' + module JSONAPI module Rails - module_function + PARSER = lambda do |body| + data = JSON.parse(body) + hash = { _jsonapi: data } - def parser - lambda do |body| - data = JSON.parse(body) - data = { _json: data } unless data.is_a?(Hash) - data.with_indifferent_access - end + hash.with_indifferent_access end end end diff --git a/lib/jsonapi/rails/railtie.rb b/lib/jsonapi/rails/railtie.rb index 9a25076..21ed56e 100644 --- a/lib/jsonapi/rails/railtie.rb +++ b/lib/jsonapi/rails/railtie.rb @@ -9,7 +9,6 @@ module JSONAPI module Rails class Railtie < ::Rails::Railtie MEDIA_TYPE = 'application/vnd.api+json'.freeze - PARSER = JSONAPI::Rails.parser RENDERERS = { jsonapi: JSONAPI::Rails.rails_renderer(SuccessRenderer), jsonapi_error: JSONAPI::Rails.rails_renderer(ErrorRenderer)