preserve array values when converting a body hash into parameters

This commit is contained in:
Jason T. Calhoun 2010-11-07 18:40:54 +08:00 committed by Erik Michaels-Ober
parent 53397635da
commit badabdd79c
2 changed files with 23 additions and 2 deletions

View File

@ -77,9 +77,14 @@ module Faraday
end
def process_to_params(pieces, params, base = nil, &block)
params.each do |key, value|
params.to_a.each do |key, value|
key_str = base ? "#{base}[#{key}]" : key
if value.kind_of?(Hash)
case value
when Array
values = value.inject([]) { |a,v| a << [nil, v] }
process_to_params(pieces, values, key_str, &block)
when Hash
process_to_params(pieces, value, key_str, &block)
else
pieces << block.call(key_str, value)

View File

@ -39,4 +39,20 @@ class FormPostTest < Faraday::TestCase
@app.process_body_for_request @env
assert_equal 'abc', @env[:body]
end
def test_processes_array_values
@env[:body] = {:a => [:b, 1]}
@app.process_body_for_request @env
assert_equal 'a[]=b&a[]=1', @env[:body]
end
def test_processes_nested_array_values
@env[:body] = {:a => [:b, {:c => :d}, [:e]]}
@app.process_body_for_request @env
# a[]=b&a[][c]=d&a[][]=e
assert_match /a\[\]=b/, @env[:body]
assert_match /a\[\]\[c\]=d/, @env[:body]
assert_match /a\[\]\[\]=e/, @env[:body]
end
end