Skip to content

Commit 0adeb96

Browse files
tylerjcdhh
andauthored
Suggestion: Return early from collection partial rendering if blank. (#560)
* Suggestion: Return early from collection partial rendering if blank. Co-authored-by: David Heinemeier Hansson <[email protected]>
1 parent 8dbc23f commit 0adeb96

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

lib/jbuilder/jbuilder_template.rb

+20-11
Original file line numberDiff line numberDiff line change
@@ -155,21 +155,30 @@ def _render_partial_with_options(options)
155155
::Kernel.raise ::NotImplementedError, "The `:spacer_template' option is not supported in collection rendering."
156156
end
157157

158-
results = CollectionRenderer
159-
.new(@context.lookup_context, options) { |&block| _scope(&block) }
160-
.render_collection_with_partial(collection, partial, @context, nil)
161-
162-
array! if results.respond_to?(:body) && results.body.nil?
158+
if collection.present?
159+
results = CollectionRenderer
160+
.new(@context.lookup_context, options) { |&block| _scope(&block) }
161+
.render_collection_with_partial(collection, partial, @context, nil)
162+
163+
array! if results.respond_to?(:body) && results.body.nil?
164+
else
165+
array!
166+
end
163167
elsif as && options.key?(:collection) && !CollectionRenderer.supported?
164168
# For Rails <= 5.2:
165169
as = as.to_sym
166170
collection = options.delete(:collection)
167-
locals = options.delete(:locals)
168-
array! collection do |member|
169-
member_locals = locals.clone
170-
member_locals.merge! collection: collection
171-
member_locals.merge! as => member
172-
_render_partial options.merge(locals: member_locals)
171+
172+
if collection.present?
173+
locals = options.delete(:locals)
174+
array! collection do |member|
175+
member_locals = locals.clone
176+
member_locals.merge! collection: collection
177+
member_locals.merge! as => member
178+
_render_partial options.merge(locals: member_locals)
179+
end
180+
else
181+
array!
173182
end
174183
else
175184
_render_partial options

test/jbuilder_template_test.rb

+16
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,12 @@ class JbuilderTemplateTest < ActiveSupport::TestCase
9898
end
9999

100100
test "nil partial collection by name" do
101+
Jbuilder::CollectionRenderer.expects(:new).never
101102
assert_equal [], render('json.partial! "post", collection: @posts, as: :post', posts: nil)
102103
end
103104

104105
test "nil partial collection by options" do
106+
Jbuilder::CollectionRenderer.expects(:new).never
105107
assert_equal [], render('json.partial! partial: "post", collection: @posts, as: :post', posts: nil)
106108
end
107109

@@ -113,7 +115,13 @@ class JbuilderTemplateTest < ActiveSupport::TestCase
113115
assert_equal "Pavel", result[5]["author"]["first_name"]
114116
end
115117

118+
test "empty array of partials from empty collection" do
119+
Jbuilder::CollectionRenderer.expects(:new).never
120+
assert_equal [], render('json.array! @posts, partial: "post", as: :post', posts: [])
121+
end
122+
116123
test "empty array of partials from nil collection" do
124+
Jbuilder::CollectionRenderer.expects(:new).never
117125
assert_equal [], render('json.array! @posts, partial: "post", as: :post', posts: nil)
118126
end
119127

@@ -126,10 +134,17 @@ class JbuilderTemplateTest < ActiveSupport::TestCase
126134
end
127135

128136
test "empty array of partials under key from nil collection" do
137+
Jbuilder::CollectionRenderer.expects(:new).never
129138
result = render('json.posts @posts, partial: "post", as: :post', posts: nil)
130139
assert_equal [], result["posts"]
131140
end
132141

142+
test "empty array of partials under key from an empy collection" do
143+
Jbuilder::CollectionRenderer.expects(:new).never
144+
result = render('json.posts @posts, partial: "post", as: :post', posts: [])
145+
assert_equal [], result["posts"]
146+
end
147+
133148
test "object fragment caching" do
134149
render(<<-JBUILDER)
135150
json.cache! "cache-key" do
@@ -293,6 +308,7 @@ class JbuilderTemplateTest < ActiveSupport::TestCase
293308

294309
if JbuilderTemplate::CollectionRenderer.supported?
295310
test "returns an empty array for an empty collection" do
311+
Jbuilder::CollectionRenderer.expects(:new).never
296312
result = render('json.array! @posts, partial: "post", as: :post, cached: true', posts: [])
297313

298314
# Do not use #assert_empty as it is important to ensure that the type of the JSON result is an array.

0 commit comments

Comments
 (0)