From 9c09f81bc6bc08122e2835fb59e66d80751bd058 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 13 Jan 2005 14:06:33 +0000 Subject: [PATCH] Added arrays as a value option for params in url_for and friends #467 [Eric Anderson] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@403 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 5 +++++ actionpack/lib/action_controller/url_rewriter.rb | 7 ++++++- actionpack/test/controller/url_test.rb | 13 ++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 2923232021..69075f04db 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,10 @@ *SVN* +* Added arrays as a value option for params in url_for and friends #467 [Eric Anderson]. Example: + + url_for(:controller => 'user', :action => 'delete', :params => { 'username' => %( paul john steve ) } ) + # => /user/delete?username[]=paul&username[]=john&username[]=steve + * Fixed that controller tests can now assert on the use of cookies #466 [Alexey] * Fixed that send_file would "remember" all the files sent by adding to the headers again and again #458 [bitsweat] diff --git a/actionpack/lib/action_controller/url_rewriter.rb b/actionpack/lib/action_controller/url_rewriter.rb index 7bf9015b37..fa003119ec 100644 --- a/actionpack/lib/action_controller/url_rewriter.rb +++ b/actionpack/lib/action_controller/url_rewriter.rb @@ -174,7 +174,12 @@ def build_query_string(hash) elements = [] query_string = "" - hash.each { |key, value| elements << "#{CGI.escape(key)}=#{CGI.escape(value.to_s)}" } + hash.each do |key, value| + key = CGI.escape key + key += '[]' if value.class == Array + value = [ value ] unless value.class == Array + value.each { |val| elements << "#{key}=#{CGI.escape(val.to_s)}" } + end unless elements.empty? then query_string << ("?" + elements.join("&")) end return query_string diff --git a/actionpack/test/controller/url_test.rb b/actionpack/test/controller/url_test.rb index b595b1c25c..8315830776 100644 --- a/actionpack/test/controller/url_test.rb +++ b/actionpack/test/controller/url_test.rb @@ -246,7 +246,18 @@ def test_parameters_with_id ) end end - + + def test_parameters_with_array + @clean_urls.each do |url| + assert_equal( + "http://www.singlefile.com/identity/show?id[]=3&id[]=5&id[]=10", + url.rewrite( + :action => "show", + :params => { 'id' => [ 3, 5, 10 ] } ) + ) + end + end + def test_action_with_id assert_equal( "http://www.singlefile.com/identity/show/7", -- GitLab