Skip to content

Commit b3a8549

Browse files
coderspeak-phitherekioquatix
authored andcommitted
Properly handle nested params.
1 parent 347afe7 commit b3a8549

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

lib/multipart/post/multipartable.rb

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,11 @@ def initialize(path, params, headers={}, boundary = Multipartable.secure_boundar
3333
parts_headers.transform_keys!(&:to_sym)
3434

3535
super(path, headers)
36-
parts = params.transform_keys(&:to_sym).map do |k,v|
37-
case v
38-
when Array
39-
v.map {|item| Parts::Part.new(boundary, k, item, parts_headers[k]) }
40-
else
41-
Parts::Part.new(boundary, k, v, parts_headers[k])
42-
end
43-
end.flatten
36+
37+
parts = Array.new
38+
generate_parts(parts, params, boundary, parts_headers, '')
4439
parts << Parts::EpiloguePart.new(boundary)
40+
4541
ios = parts.map {|p| p.to_io }
4642
self.set_content_type(headers["Content-Type"] || "multipart/form-data",
4743
{ "boundary" => boundary })
@@ -52,6 +48,30 @@ def initialize(path, params, headers={}, boundary = Multipartable.secure_boundar
5248
end
5349

5450
attr :boundary
51+
52+
private
53+
54+
def generate_parts(parts, params, boundary, parts_headers, prefix)
55+
params.each do |key, value|
56+
key = key.to_sym
57+
generate_nested_parts(parts, key, value, boundary, parts_headers, prefix)
58+
end
59+
end
60+
61+
def generate_nested_parts(parts, key, value, boundary, parts_headers, prefix)
62+
nested_prefix = prefix.empty? ? key.to_s : "#{prefix}[#{key}]"
63+
64+
case value
65+
when Array
66+
value.each do |item|
67+
generate_nested_parts(parts, '', item, boundary, parts_headers, nested_prefix)
68+
end
69+
when Hash
70+
generate_parts(parts, value, boundary, parts_headers, nested_prefix)
71+
else
72+
parts << Parts::Part.new(boundary, nested_prefix, value, parts_headers[key])
73+
end
74+
end
5575
end
5676
end
5777
end

0 commit comments

Comments
 (0)