Skip to content

Commit 3fe343f

Browse files
committed
Merge pull request #1232 from beauby/move-root-to-adapter
Extract attributes filtering from serializer into adapter.
2 parents ea1a709 + 658810e commit 3fe343f

File tree

8 files changed

+35
-59
lines changed

8 files changed

+35
-59
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Fixes:
2424
- [#1214](https://github.com/rails-api/active_model_serializers/pull/1214) retrieve the key from the reflection options when building associations (@NullVoxPopuli, @hut8)
2525

2626
Misc:
27+
- [#1232](https://github.com/rails-api/active_model_serializers/pull/1232) fields option no longer handled at serializer level (@beauby)
2728
- [#1178](https://github.com/rails-api/active_model_serializers/pull/1178) env CAPTURE_STDERR=false lets devs see hard failures (@bf4)
2829
- [#1177](https://github.com/rails-api/active_model_serializers/pull/1177) Remove Adapter autoloads in favor of require (@bf4)
2930
- [#1117](https://github.com/rails-api/active_model_serializers/pull/1117) FlattenJson adapter no longer inherits Json adapter, renamed to Attributes (@bf4)

lib/active_model/serializer.rb

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,8 @@ def json_key
144144
root || object.class.model_name.to_s.underscore
145145
end
146146

147-
def attributes(options = {})
148-
attributes =
149-
if options[:fields]
150-
self.class._attributes & options[:fields]
151-
else
152-
self.class._attributes.dup
153-
end
147+
def attributes
148+
attributes = self.class._attributes.dup
154149

155150
attributes.each_with_object({}) do |name, hash|
156151
unless self.class._fragmented

lib/active_model/serializer/adapter/attributes.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ def include_meta(json)
5757

5858
def resource_object_for(options)
5959
cache_check(serializer) do
60-
serializer.attributes(options)
60+
attributes = serializer.attributes
61+
attributes.slice!(*options[:fields]) if options[:fields]
62+
63+
attributes
6164
end
6265
end
6366
end

lib/active_model/serializer/adapter/json_api.rb

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def initialize(serializer, options = {})
4747

4848
fields = options.delete(:fields)
4949
if fields
50-
@fieldset = ActiveModel::Serializer::Fieldset.new(fields, serializer.json_key)
50+
@fieldset = ActiveModel::Serializer::Fieldset.new(fields)
5151
else
5252
@fieldset = options[:fieldset]
5353
end
@@ -60,7 +60,7 @@ def serializable_hash(options = nil)
6060
if serializer.respond_to?(:each)
6161
serializable_hash_for_collection(options)
6262
else
63-
serializable_hash_for_single_resource(options)
63+
serializable_hash_for_single_resource
6464
end
6565

6666
ApiObjects::JsonApi.add!(hash)
@@ -99,8 +99,8 @@ def serializable_hash_for_collection(options)
9999
hash
100100
end
101101

102-
def serializable_hash_for_single_resource(options)
103-
primary_data = primary_data_for(serializer, options)
102+
def serializable_hash_for_single_resource
103+
primary_data = primary_data_for(serializer)
104104
relationships = relationships_for(serializer)
105105
included = included_resources(@include_tree)
106106
hash = { data: primary_data }
@@ -134,22 +134,22 @@ def resource_identifier_for(serializer)
134134
{ id: id.to_s, type: type }
135135
end
136136

137-
def resource_object_for(serializer, options = {})
138-
options[:fields] = fieldset && fieldset.fields_for(serializer)
139-
137+
def resource_object_for(serializer)
140138
cache_check(serializer) do
141-
result = resource_identifier_for(serializer)
142-
attributes = serializer.attributes(options).except(:id)
143-
result[:attributes] = attributes if attributes.any?
144-
result
139+
resource_object = resource_identifier_for(serializer)
140+
requested_fields = fieldset && fieldset.fields_for(resource_object[:type])
141+
attributes = serializer.attributes.except(:id)
142+
attributes.slice!(*requested_fields) if requested_fields
143+
resource_object[:attributes] = attributes if attributes.any?
144+
resource_object
145145
end
146146
end
147147

148-
def primary_data_for(serializer, options)
148+
def primary_data_for(serializer)
149149
if serializer.respond_to?(:each)
150-
serializer.map { |s| resource_object_for(s, options) }
150+
serializer.map { |s| resource_object_for(s) }
151151
else
152-
resource_object_for(serializer, options)
152+
resource_object_for(serializer)
153153
end
154154
end
155155

@@ -187,7 +187,7 @@ def add_included_resources_for(serializer, include_tree, included)
187187
else
188188
return unless serializer && serializer.object
189189

190-
primary_data = primary_data_for(serializer, instance_options)
190+
primary_data = primary_data_for(serializer)
191191
relationships = relationships_for(serializer)
192192
primary_data[:relationships] = relationships if relationships.any?
193193

lib/active_model/serializer/fieldset.rb

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,27 @@
11
module ActiveModel
22
class Serializer
33
class Fieldset
4-
def initialize(fields, root = nil)
5-
@root = root
4+
def initialize(fields)
65
@raw_fields = fields
76
end
87

98
def fields
109
@fields ||= parsed_fields
1110
end
1211

13-
def fields_for(serializer)
14-
key = serializer.json_key
15-
fields[key.to_sym] || fields[key.pluralize.to_sym]
12+
def fields_for(type)
13+
fields[type.singularize.to_sym] || fields[type.pluralize.to_sym]
1614
end
1715

1816
private
1917

2018
ActiveModelSerializers.silence_warnings do
21-
attr_reader :raw_fields, :root
19+
attr_reader :raw_fields
2220
end
2321

2422
def parsed_fields
2523
if raw_fields.is_a?(Hash)
2624
raw_fields.inject({}) { |h, (k, v)| h[k.to_sym] = v.map(&:to_sym); h }
27-
elsif raw_fields.is_a?(Array)
28-
if root.nil?
29-
raise ArgumentError, 'The root argument must be specified if the fields argument is an array.'.freeze
30-
end
31-
hash = {}
32-
hash[root.to_sym] = raw_fields.map(&:to_sym)
33-
hash
3425
else
3526
{}
3627
end

test/adapter/json_api/collection_test.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,10 @@ def test_include_multiple_posts
5858
end
5959

6060
def test_limiting_fields
61-
@adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, fields: ['title'])
62-
61+
actual = ActiveModel::SerializableResource.new(
62+
[@first_post, @second_post], adapter: :json_api,
63+
fields: { posts: ['title'] })
64+
.serializable_hash
6365
expected = [
6466
{
6567
id: '1',
@@ -86,7 +88,7 @@ def test_limiting_fields
8688
}
8789
}
8890
]
89-
assert_equal(expected, @adapter.serializable_hash[:data])
91+
assert_equal(expected, actual[:data])
9092
end
9193
end
9294
end

test/serializers/attributes_test.rb

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,6 @@ def test_attributes_definition
1818
@profile_serializer.class._attributes)
1919
end
2020

21-
def test_attributes_with_fields_option
22-
assert_equal({ name: 'Name 1' },
23-
@profile_serializer.attributes(fields: [:name]))
24-
end
25-
2621
def test_attributes_inheritance_definition
2722
assert_equal([:id, :body], @serializer_klass._attributes)
2823
end

test/serializers/fieldset_test.rb

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,11 @@ module ActiveModel
44
class Serializer
55
class FieldsetTest < Minitest::Test
66
def test_fieldset_with_hash
7-
fieldset = ActiveModel::Serializer::Fieldset.new({ 'post' => %w(id title), 'coment' => ['body'] })
7+
fieldset = ActiveModel::Serializer::Fieldset.new('post' => %w(id title), 'comment' => ['body'])
8+
expected = { :post => [:id, :title], :comment => [:body] }
89

9-
assert_equal(
10-
{ :post => [:id, :title], :coment => [:body] },
11-
fieldset.fields
12-
)
13-
end
14-
15-
def test_fieldset_with_array_of_fields_and_root_name
16-
fieldset = ActiveModel::Serializer::Fieldset.new(['title'], 'post')
17-
18-
assert_equal(
19-
{ :post => [:title] },
20-
fieldset.fields
21-
)
10+
assert_equal(expected, fieldset.fields)
2211
end
2312
end
2413
end
25-
end
14+
end

0 commit comments

Comments
 (0)