From 44d5e0f9c5bd54a5fbfd265b805c55e65d95af11 Mon Sep 17 00:00:00 2001 From: homer Date: Mon, 28 May 2018 18:49:36 +0500 Subject: [PATCH] Fix serialization for nested nil includes with block --- lib/fast_jsonapi/serialization_core.rb | 2 +- spec/lib/object_serializer_spec.rb | 7 +++++++ spec/shared/contexts/movie_context.rb | 19 ++++++++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/fast_jsonapi/serialization_core.rb b/lib/fast_jsonapi/serialization_core.rb index de138cd..668aebe 100644 --- a/lib/fast_jsonapi/serialization_core.rb +++ b/lib/fast_jsonapi/serialization_core.rb @@ -182,7 +182,7 @@ module FastJsonapi object = relationship[:object_block].call(record, params) return object.map(&:id) if object.respond_to? :map - return object.id + return object.try(:id) end record.public_send(relationship[:id_method_name]) diff --git a/spec/lib/object_serializer_spec.rb b/spec/lib/object_serializer_spec.rb index 2d8c99e..7941f66 100644 --- a/spec/lib/object_serializer_spec.rb +++ b/spec/lib/object_serializer_spec.rb @@ -97,6 +97,13 @@ describe FastJsonapi::ObjectSerializer do expect(serializable_hash['data']['relationships']['owner']['data']).to be nil end + it 'returns correct json when belongs_to returns nil and there is a block for the relationship' do + movie.owner_id = nil + json = MovieSerializer.new(movie, {include: [:owner]}).serialized_json + serializable_hash = JSON.parse(json) + expect(serializable_hash['data']['relationships']['owner']['data']).to be nil + end + it 'returns correct json when has_one returns nil' do supplier.account_id = nil json = SupplierSerializer.new(supplier).serialized_json diff --git a/spec/shared/contexts/movie_context.rb b/spec/shared/contexts/movie_context.rb index 7871f8b..a73e869 100644 --- a/spec/shared/contexts/movie_context.rb +++ b/spec/shared/contexts/movie_context.rb @@ -43,6 +43,13 @@ RSpec.shared_context 'movie class' do ac end + def owner + return unless owner_id + ow = Owner.new + ow.id = owner_id + ow + end + def cache_key "#{id}" end @@ -146,6 +153,14 @@ RSpec.shared_context 'movie class' do attr_accessor :id end + class Owner + attr_accessor :id + end + + class OwnerSerializer + include FastJsonapi::ObjectSerializer + end + # serializers class MovieSerializer include FastJsonapi::ObjectSerializer @@ -153,7 +168,9 @@ RSpec.shared_context 'movie class' do # director attr is not mentioned intentionally attributes :name, :release_year has_many :actors - belongs_to :owner, record_type: :user + belongs_to :owner, record_type: :user do |object, params| + object.owner + end belongs_to :movie_type has_one :advertising_campaign end