Skip to content

Commit c181cf8

Browse files
committed
Suggestion: Return early from collection partial rendering if blank.
1 parent 3875613 commit c181cf8

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

lib/jbuilder/jbuilder_template.rb

+5
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ def _render_partial_with_options(options)
147147
options[:locals].merge!(json: self)
148148
collection = EnumerableCompat.new(collection) if collection.respond_to?(:count) && !collection.respond_to?(:size)
149149

150+
return array! if collection.blank?
151+
150152
if options.has_key?(:layout)
151153
raise ::NotImplementedError, "The `:layout' option is not supported in collection rendering."
152154
end
@@ -164,6 +166,9 @@ def _render_partial_with_options(options)
164166
# For Rails <= 5.2:
165167
as = as.to_sym
166168
collection = options.delete(:collection)
169+
170+
return array! if collection.blank?
171+
167172
locals = options.delete(:locals)
168173
array! collection do |member|
169174
member_locals = locals.clone

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)