@@ -295,20 +295,8 @@ def attributes_for(serializer, fields)
295
295
296
296
# {http://jsonapi.org/format/#document-resource-objects Document Resource Objects}
297
297
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 )
310
299
311
- links = links_for ( serializer )
312
300
# toplevel_links
313
301
# definition:
314
302
# allOf
@@ -322,7 +310,10 @@ def resource_object_for(serializer, include_slice = {})
322
310
# prs:
323
311
# https://github.com/rails-api/active_model_serializers/pull/1247
324
312
# 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
326
317
327
318
# toplevel_meta
328
319
# alias meta
@@ -332,12 +323,33 @@ def resource_object_for(serializer, include_slice = {})
332
323
# {
333
324
# :'git-ref' => 'abc123'
334
325
# }
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
337
330
338
331
resource_object
339
332
end
340
333
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
+
341
353
# {http://jsonapi.org/format/#document-resource-object-relationships Document Resource Object Relationship}
342
354
# relationships
343
355
# definition:
0 commit comments