@@ -295,20 +295,8 @@ def attributes_for(serializer, fields)
295295
296296 # {http://jsonapi.org/format/#document-resource-objects Document Resource Objects}
297297 def resource_object_for ( serializer , include_slice = { } )
298- resource_object = serializer . fetch ( self ) do
299- resource_object = ResourceIdentifier . new ( serializer , instance_options ) . as_json
300-
301- requested_fields = fieldset && fieldset . fields_for ( resource_object [ :type ] )
302- attributes = attributes_for ( serializer , requested_fields )
303- resource_object [ :attributes ] = attributes if attributes . any?
304- resource_object
305- end
306-
307- requested_associations = fieldset . fields_for ( resource_object [ :type ] ) || '*'
308- relationships = relationships_for ( serializer , requested_associations , include_slice )
309- resource_object [ :relationships ] = relationships if relationships . any?
298+ resource_object = data_for ( serializer , include_slice )
310299
311- links = links_for ( serializer )
312300 # toplevel_links
313301 # definition:
314302 # allOf
@@ -322,7 +310,10 @@ def resource_object_for(serializer, include_slice = {})
322310 # prs:
323311 # https://github.com/rails-api/active_model_serializers/pull/1247
324312 # https://github.com/rails-api/active_model_serializers/pull/1018
325- resource_object [ :links ] = links if links . any?
313+ if ( links = links_for ( serializer ) ) . any?
314+ resource_object ||= { }
315+ resource_object [ :links ] = links
316+ end
326317
327318 # toplevel_meta
328319 # alias meta
@@ -332,12 +323,33 @@ def resource_object_for(serializer, include_slice = {})
332323 # {
333324 # :'git-ref' => 'abc123'
334325 # }
335- meta = meta_for ( serializer )
336- resource_object [ :meta ] = meta unless meta . blank?
326+ if ( meta = meta_for ( serializer ) ) . present?
327+ resource_object ||= { }
328+ resource_object [ :meta ] = meta
329+ end
337330
338331 resource_object
339332 end
340333
334+ def data_for ( serializer , include_slice )
335+ data = serializer . fetch ( self ) do
336+ resource_object = ResourceIdentifier . new ( serializer , instance_options ) . as_json
337+ break nil if resource_object . nil?
338+
339+ requested_fields = fieldset && fieldset . fields_for ( resource_object [ :type ] )
340+ attributes = attributes_for ( serializer , requested_fields )
341+ resource_object [ :attributes ] = attributes if attributes . any?
342+ resource_object
343+ end
344+ data . tap do |resource_object |
345+ next if resource_object . nil?
346+ # NOTE(BF): the attributes are cached above, separately from the relationships, below.
347+ requested_associations = fieldset . fields_for ( resource_object [ :type ] ) || '*'
348+ relationships = relationships_for ( serializer , requested_associations , include_slice )
349+ resource_object [ :relationships ] = relationships if relationships . any?
350+ end
351+ end
352+
341353 # {http://jsonapi.org/format/#document-resource-object-relationships Document Resource Object Relationship}
342354 # relationships
343355 # definition:
0 commit comments