Skip to content

Commit fc1562c

Browse files
committed
add fields to adapter initialize function, pull in master, add tests using includes with fields
1 parent c9c58e3 commit fc1562c

File tree

7 files changed

+31
-63
lines changed

7 files changed

+31
-63
lines changed

lib/action_controller/serialization.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module Serialization
66

77
include ActionController::Renderers
88

9-
ADAPTER_OPTION_KEYS = [:include, :root]
9+
ADAPTER_OPTION_KEYS = [:include, :fields, :root]
1010

1111
[:_render_option_json, :_render_with_renderer_json].each do |renderer_method|
1212
define_method renderer_method do |resource, options|

lib/active_model/serializer/adapter.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,7 @@ def serializable_hash(options = {})
1818
end
1919

2020
def as_json(options = {})
21-
if fields = options.delete(:fields)
22-
options[:fieldset] = ActiveModel::Serializer::Fieldset.new(fields, serializer.json_key)
23-
end
24-
25-
serializable_hash(options).to_json
21+
serializable_hash(options)
2622
end
2723
end
2824
end

lib/active_model/serializer/adapter/json_api.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,20 @@ def initialize(serializer, options = {})
77
serializer.root = true
88
@hash = {}
99
@top = @options.fetch(:top) { @hash }
10+
11+
if fields = options.delete(:fields)
12+
@fieldset = ActiveModel::Serializer::Fieldset.new(fields, serializer.json_key)
13+
else
14+
@fieldset = options[:fieldset]
15+
end
1016
end
1117

1218
def serializable_hash(options = {})
1319
@root = (@options[:root] || serializer.json_key.to_s.pluralize).to_sym
14-
@fieldset = options[:fieldset]
1520

1621
if serializer.respond_to?(:each)
1722
@hash[@root] = serializer.map do |s|
18-
self.class.new(s, @options.merge(top: @top)).serializable_hash[@root]
23+
self.class.new(s, @options.merge(top: @top, fieldset: @fieldset)).serializable_hash[@root]
1924
end
2025
else
2126
@hash[@root] = attributes_for_serializer(serializer, @options)
@@ -94,7 +99,6 @@ def add_linked(resource, serializer, parent = nil)
9499
private
95100

96101
def attributes_for_serializer(serializer, options)
97-
98102
if fields = @fieldset && @fieldset.fields_for(serializer)
99103
options[:fields] = fields
100104
end

test/adapter/json_api/belongs_to_test.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ def test_includes_linked_post
3434
assert_equal([{id: "42", title: 'New Post', body: 'Body'}], @adapter.serializable_hash[:linked][:posts])
3535
end
3636

37+
def test_limiting_linked_post_fields
38+
@adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'post', fields: {post: [:title]})
39+
assert_equal([{title: 'New Post'}], @adapter.serializable_hash[:linked][:posts])
40+
end
41+
3742
def test_include_nil_author
3843
serializer = PostSerializer.new(@anonymous_post)
3944
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)

test/adapter/json_api/collection_test.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ def test_include_multiple_posts
2525
{ title: "New Post", body: "Body", id: "2", links: { comments: [], author: "1" } }
2626
], @adapter.serializable_hash[:posts])
2727
end
28+
29+
def test_limiting_fields
30+
@adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, fields: ['title'])
31+
assert_equal([
32+
{ title: "Hello!!", links: { comments: [], author: "1" } },
33+
{ title: "New Post", links: { comments: [], author: "1" } }
34+
], @adapter.serializable_hash[:posts])
35+
end
36+
2837
end
2938
end
3039
end

test/adapter/json_api/fieldset_test.rb

Lines changed: 0 additions & 54 deletions
This file was deleted.

test/adapter/json_api/has_many_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ def test_includes_linked_comments
4040
], @adapter.serializable_hash[:linked][:comments])
4141
end
4242

43+
def test_limit_fields_of_linked_comments
44+
@adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'comments', fields: {comment: [:body]})
45+
assert_equal([
46+
{body: 'ZOMG A COMMENT'},
47+
{body: 'ZOMG ANOTHER COMMENT'}
48+
], @adapter.serializable_hash[:linked][:comments])
49+
end
50+
4351
def test_no_include_linked_if_comments_is_empty
4452
serializer = PostSerializer.new(@post_without_comments)
4553
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)

0 commit comments

Comments
 (0)