diff options
-rw-r--r-- | activeresource/CHANGELOG | 2 | ||||
-rw-r--r-- | activeresource/lib/active_resource/base.rb | 18 | ||||
-rw-r--r-- | activeresource/test/base_test.rb | 7 |
3 files changed, 8 insertions, 19 deletions
diff --git a/activeresource/CHANGELOG b/activeresource/CHANGELOG index 79c8e66298..c5d11d2c63 100644 --- a/activeresource/CHANGELOG +++ b/activeresource/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Allow array and hash query parameters. #7756 [Greg Spurrier] + * Loading a resource preserves its prefix_options. #7353 [Ryan Daigle] * Carry over the convenience of #create from ActiveRecord. Closes #7340. [Ryan Daigle] diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb index a4e21b3253..68ce7e080a 100644 --- a/activeresource/lib/active_resource/base.rb +++ b/activeresource/lib/active_resource/base.rb @@ -140,23 +140,7 @@ module ActiveResource def query_string(options) # Omit parameters which appear in the URI path. query_params = options.reject { |key, value| prefix_parameters.include?(key) } - - # Accumulate a list of escaped key=value pairs for the given parameters. - pairs = [] - query_params.each do |key, value| - key = CGI.escape(key.to_s) - - # a => b becomes a=b - # a => [b, c] becomes a[]=b&a[]=c - case value - when Array - value.each { |val| pairs << "#{key}[]=#{CGI.escape(val.to_s)}" } - else - pairs << "#{key}=#{CGI.escape(value.to_s)}" - end - end - - "?#{pairs * '&'}" unless pairs.empty? + "?#{query_params.to_query}" unless query_params.empty? end end diff --git a/activeresource/test/base_test.rb b/activeresource/test/base_test.rb index 15e9609034..c3ae05a1ae 100644 --- a/activeresource/test/base_test.rb +++ b/activeresource/test/base_test.rb @@ -97,7 +97,9 @@ class BaseTest < Test::Unit::TestCase assert_equal '/people.xml?gender=male', Person.collection_path('gender' => 'male') assert_equal '/people.xml?gender=male&student=true', Person.collection_path(:gender => 'male', :student => true) - assert_equal '/people.xml?name[]=bob&name[]=your+uncle%2Bme&name[]=&name[]=false', Person.collection_path(:name => ['bob', 'your uncle+me', nil, false]) + assert_equal '/people.xml?name%5B%5D=bob&name%5B%5D=your+uncle%2Bme&name%5B%5D=&name%5B%5D=false', Person.collection_path(:name => ['bob', 'your uncle+me', nil, false]) + + assert_equal '/people.xml?struct%5Ba%5D%5B%5D=2&struct%5Ba%5D%5B%5D=1&struct%5Bb%5D=fred', Person.collection_path(:struct => {:a => [2,1], 'b' => 'fred'}) end def test_custom_element_path @@ -106,7 +108,8 @@ class BaseTest < Test::Unit::TestCase def test_custom_element_path_with_parameters assert_equal '/people/1/addresses/1.xml?type=work', StreetAddress.element_path(1, :person_id => 1, :type => 'work') - assert_equal '/people/1/addresses/1.xml?type[]=work&type[]=play+time', StreetAddress.element_path(1, :person_id => 1, :type => ['work', 'play time']) + assert_equal '/people/1/addresses/1.xml?type=work', StreetAddress.element_path(1, :type => 'work', :person_id => 1) + assert_equal '/people/1/addresses/1.xml?type%5B%5D=work&type%5B%5D=play+time', StreetAddress.element_path(1, :person_id => 1, :type => ['work', 'play time']) end def test_custom_collection_path |