Skip to content

Commit a47c639

Browse files
committed
Prevent creation of unnecessary fieldset(mirror and revise changes from rails-api#2370)
Co-authored-by: https://github.com/abcang
1 parent 9fa9373 commit a47c639

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

lib/active_model_serializers/adapter/attributes.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ module Adapter
55
class Attributes < Base
66
def initialize(*)
77
super
8-
instance_options[:fieldset] ||= ActiveModel::Serializer::Fieldset.new(fields_to_fieldset(instance_options.delete(:fields)))
8+
9+
instance_options[:fieldset] ||= begin
10+
fieldset = fields_to_fieldset(instance_options.delete(:fields))
11+
fieldset && ActiveModel::Serializer::Fieldset.new(fieldset)
12+
end
913
end
1014

1115
def serializable_hash(options = nil)

lib/active_model_serializers/adapter/json_api.rb

+3-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def self.fragment_cache(cached_hash, non_cached_hash, root = true)
5353
def initialize(serializer, options = {})
5454
super
5555
@include_directive = JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true)
56-
@fieldset = options[:fieldset] || ActiveModel::Serializer::Fieldset.new(options.delete(:fields))
56+
@fieldset = options[:fieldset] || ((option_fields = options.delete(:fields)) && ActiveModel::Serializer::Fieldset.new(option_fields))
5757
end
5858

5959
# {http://jsonapi.org/format/#crud Requests are transactional, i.e. success or failure}
@@ -348,7 +348,8 @@ def data_for(serializer, include_slice)
348348
data.tap do |resource_object|
349349
next if resource_object.nil?
350350
# NOTE(BF): the attributes are cached above, separately from the relationships, below.
351-
requested_associations = fieldset.fields_for(resource_object[:type]) || '*'
351+
requested_fields = fieldset && fieldset.fields_for(resource_object[:type])
352+
requested_associations = requested_fields || '*'
352353
relationships = relationships_for(serializer, requested_associations, include_slice)
353354
resource_object[:relationships] = relationships if relationships.any?
354355
end

test/serializers/attribute_test.rb

+14
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ def test_attribute_inheritance_with_key
2727
assert_equal({ id: 1, title: 'AMS Hints' }, adapter.serializable_hash)
2828
end
2929

30+
def test_attribute_initialization_with_empty_fields
31+
inherited_klass = Class.new(AlternateBlogSerializer)
32+
blog_serializer = inherited_klass.new(@blog)
33+
adapter = ActiveModelSerializers::Adapter::Attributes.new(blog_serializer, {fieldset: nil, fields: nil})
34+
assert_nil(adapter.instance_options[:fieldset])
35+
end
36+
37+
def test_attribute_initialization_with_present_fields
38+
inherited_klass = Class.new(AlternateBlogSerializer)
39+
blog_serializer = inherited_klass.new(@blog)
40+
adapter = ActiveModelSerializers::Adapter::Attributes.new(blog_serializer, {fieldset: nil, fields: [:id]})
41+
assert_instance_of(ActiveModel::Serializer::Fieldset, adapter.instance_options[:fieldset])
42+
end
43+
3044
def test_multiple_calls_with_the_same_attribute
3145
serializer_class = Class.new(ActiveModel::Serializer) do
3246
attribute :title

0 commit comments

Comments
 (0)