diff --git a/lib/jsonapi/deserialization.rb b/lib/jsonapi/deserialization.rb index 0a9d5de..a2593ec 100644 --- a/lib/jsonapi/deserialization.rb +++ b/lib/jsonapi/deserialization.rb @@ -35,9 +35,11 @@ def jsonapi_inflector def jsonapi_deserialize(document, options = {}) if document.respond_to?(:permit!) # Handle Rails params... - primary_data = document.dup.require(:data).permit!.as_json + primary_data = + document.dup.require(:data).permit!.to_h.deep_stringify_keys elsif document.is_a?(Hash) - primary_data = (document.as_json['data'] || {}).deep_dup + primary_data = + (document.to_h.deep_stringify_keys['data'] || {}).deep_dup else return {} end diff --git a/spec/deserialization_spec.rb b/spec/deserialization_spec.rb index b23c183..897ad48 100644 --- a/spec/deserialization_spec.rb +++ b/spec/deserialization_spec.rb @@ -2,6 +2,7 @@ RSpec.describe JSONAPI::Deserialization do let(:jsonapi_deserialize) { UsersController.new.method(:jsonapi_deserialize) } + let(:file_object) { ::File.new('./Gemfile') } let(:document) do { data: { @@ -9,7 +10,8 @@ type: 'note', attributes: { title: 'Title 1', - date: '2015-12-20' + date: '2015-12-20', + file: file_object }, relationships: { author: { @@ -40,7 +42,7 @@ describe '#jsonapi_deserialize' do it do - expect(jsonapi_deserialize.call(document)).to eq( + expect(jsonapi_deserialize.call(document)).to include( 'id' => 1, 'date' => '2015-12-20', 'title' => 'Title 1', @@ -50,6 +52,18 @@ ) end + context 'with file attribute' do + it do + expect(jsonapi_deserialize.call(document)['file']) + .to be_an_instance_of(File) + end + + it do + expect(jsonapi_deserialize.call(document)['file']) + .not_to be_an_instance_of(String) + end + end + context 'with `only`' do it do expect(jsonapi_deserialize.call(document, only: :notes)).to eq( @@ -61,7 +75,7 @@ context 'with `except`' do it do expect( - jsonapi_deserialize.call(document, except: [:date, :title]) + jsonapi_deserialize.call(document, except: [:date, :title, :file]) ).to eq( 'id' => 1, 'author_id' => 2,