Skip to content

Commit

Permalink
Prevent creation of unnecessary fieldset(mirror and revise changes from
Browse files Browse the repository at this point in the history
  • Loading branch information
liijunwei committed Aug 15, 2023
1 parent 9fa9373 commit 73420cd
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 3 deletions.
6 changes: 5 additions & 1 deletion lib/active_model_serializers/adapter/attributes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ module Adapter
class Attributes < Base
def initialize(*)
super
instance_options[:fieldset] ||= ActiveModel::Serializer::Fieldset.new(fields_to_fieldset(instance_options.delete(:fields)))

instance_options[:fieldset] ||= begin
fieldset = fields_to_fieldset(instance_options.delete(:fields))
fieldset && ActiveModel::Serializer::Fieldset.new(fieldset)
end
end

def serializable_hash(options = nil)
Expand Down
5 changes: 3 additions & 2 deletions lib/active_model_serializers/adapter/json_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def self.fragment_cache(cached_hash, non_cached_hash, root = true)
def initialize(serializer, options = {})
super
@include_directive = JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true)
@fieldset = options[:fieldset] || ActiveModel::Serializer::Fieldset.new(options.delete(:fields))
@fieldset = options[:fieldset] || ((option_fields = options.delete(:fields)) && ActiveModel::Serializer::Fieldset.new(option_fields))
end

# {http://jsonapi.org/format/#crud Requests are transactional, i.e. success or failure}
Expand Down Expand Up @@ -348,7 +348,8 @@ def data_for(serializer, include_slice)
data.tap do |resource_object|
next if resource_object.nil?
# NOTE(BF): the attributes are cached above, separately from the relationships, below.
requested_associations = fieldset.fields_for(resource_object[:type]) || '*'
requested_fields = fieldset && fieldset.fields_for(resource_object[:type])
requested_associations = requested_fields || '*'
relationships = relationships_for(serializer, requested_associations, include_slice)
resource_object[:relationships] = relationships if relationships.any?
end
Expand Down
14 changes: 14 additions & 0 deletions test/serializers/attribute_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,20 @@ def test_attribute_inheritance_with_key
assert_equal({ id: 1, title: 'AMS Hints' }, adapter.serializable_hash)
end

def test_attribute_initialization_with_empty_fields
inherited_klass = Class.new(AlternateBlogSerializer)
blog_serializer = inherited_klass.new(@blog)
adapter = ActiveModelSerializers::Adapter::Attributes.new(blog_serializer, {fieldset: nil, fields: nil})
assert_nil(adapter.instance_options[:fieldset])
end

def test_attribute_initialization_with_present_fields
inherited_klass = Class.new(AlternateBlogSerializer)
blog_serializer = inherited_klass.new(@blog)
adapter = ActiveModelSerializers::Adapter::Attributes.new(blog_serializer, {fieldset: nil, fields: [:id]})
assert_equal(ActiveModel::Serializer::Fieldset, adapter.instance_options[:fieldset].class)
end

def test_multiple_calls_with_the_same_attribute
serializer_class = Class.new(ActiveModel::Serializer) do
attribute :title
Expand Down

0 comments on commit 73420cd

Please sign in to comment.