aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2007-03-11 13:27:57 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2007-03-11 13:27:57 +0000
commitd97456dd82c64a6bd67728e484df38d1f1bcb37f (patch)
tree2758e58de30a5937a53bf85d309d907423d3c0f3
parent8a7275e7f4addaf7e7f42e32abc23121be87631b (diff)
downloadrails-d97456dd82c64a6bd67728e484df38d1f1bcb37f.tar.gz
rails-d97456dd82c64a6bd67728e484df38d1f1bcb37f.tar.bz2
rails-d97456dd82c64a6bd67728e484df38d1f1bcb37f.zip
Allow array and hash query parameters. Closes #7756.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6379 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--activeresource/CHANGELOG2
-rw-r--r--activeresource/lib/active_resource/base.rb18
-rw-r--r--activeresource/test/base_test.rb7
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