From 99c649ed0b2870ac5d84d038caca4a838db97325 Mon Sep 17 00:00:00 2001 From: Wesley Beary Date: Sun, 17 Aug 2008 14:36:30 -0700 Subject: [PATCH] [#401] fix array encoding in hash.to_params --- lib/extlib/hash.rb | 39 +++++++++++++++++++++++++-------------- spec/hash_spec.rb | 2 +- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/lib/extlib/hash.rb b/lib/extlib/hash.rb index 18e0a20..5d5d35f 100644 --- a/lib/extlib/hash.rb +++ b/lib/extlib/hash.rb @@ -91,31 +91,42 @@ class Hash # :phones => ['111-111-1111', '222-222-2222'] # } # }.to_params - # #=> "name=Bob&address[city]=Ruby Central&address[phones]=111-111-1111222-222-2222&address[street]=111 Ruby Ave." + # #=> "name=Bob&address[city]=Ruby Central&address[phones][]=111-111-1111&address[phones][]=222-222-2222&address[street]=111 Ruby Ave." def to_params - params = '' + params = self.map { |k,v| normalize_param(k,v) }.join + params.chop! # trailing & + params + end + + # @param key The key for the param. + # @param value The value for the param. + # + # @return This key value pair as a param + # + # @example normalize_param(:name, "Bob") #=> "name=Bob&" + def normalize_param(key, value) + param = '' stack = [] - each do |k, v| - if v.is_a?(Hash) - stack << [k,v] - else - params << "#{k}=#{v}&" - end + if value.is_a?(Array) + param << value.map { |element| normalize_param("#{key}[]", element) }.join + elsif value.is_a?(Hash) + stack << [key,value] + else + param << "#{key}=#{value}&" end stack.each do |parent, hash| - hash.each do |k, v| - if v.is_a?(Hash) - stack << ["#{parent}[#{k}]", v] + hash.each do |key, value| + if value.is_a?(Hash) + stack << ["#{parent}[#{key}]", value] else - params << "#{parent}[#{k}]=#{v}&" + param << normalize_param("#{parent}[#{key}]", value) end end end - params.chop! # trailing & - params + param end # @param *allowed The hash keys to include. diff --git a/spec/hash_spec.rb b/spec/hash_spec.rb index e175085..4f9a7fb 100644 --- a/spec/hash_spec.rb +++ b/spec/hash_spec.rb @@ -503,7 +503,7 @@ describe Hash, 'to_params' do it 'should convert correctly into query parameters' do @hash.to_params.split('&').sort.should == - 'name=Bob&address[city]=Ruby Central&address[phones]=111-111-1111222-222-2222&address[street]=111 Ruby Ave.'.split('&').sort + 'name=Bob&address[city]=Ruby Central&address[phones][]=111-111-1111&address[phones][]=222-222-2222&address[street]=111 Ruby Ave.'.split('&').sort end it 'should not leave a trailing &' do -- 1.5.4.5