From a75d273ececd36221c58540c2872601d8ce17eab Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Wed, 5 Sep 2007 23:37:17 +0000 Subject: Allow additional parameters to be passed to named route helpers when using positional arguments. Closes #8930 [ian.w.white@gmail.com] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7411 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_controller/routing.rb | 9 ++++++++- actionpack/test/controller/routing_test.rb | 12 ++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 97c16a7e25..233a3661a5 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Allow additional parameters to be passed to named route helpers when using positional arguments. Closes #8930 [ian.w.white@gmail.com] + * Make render :partial work with a :collection of Hashes, previously this wasn't possible due to backwards compatibility restrictions. [lifofifo] * request.host works with IPv6 addresses. #9458 [yuya] diff --git a/actionpack/lib/action_controller/routing.rb b/actionpack/lib/action_controller/routing.rb index 654727020a..2565a6dc3c 100644 --- a/actionpack/lib/action_controller/routing.rb +++ b/actionpack/lib/action_controller/routing.rb @@ -1160,10 +1160,17 @@ module ActionController # instead of # # foo_url(:bar => bar, :baz => baz, :bang => bang) - args.zip(#{segment_keys.inspect}).inject({}) do |h, (v, k)| + # + # Also allow options hash, so you can do + # + # foo_url(bar, baz, bang, :sort_by => 'baz') + # + options = args.last.is_a?(Hash) ? args.pop : {} + args = args.zip(#{segment_keys.inspect}).inject({}) do |h, (v, k)| h[k] = v h end + options.merge(args) end url_for(#{hash_access_method}(opts)) diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index 758d37396a..858ec6f3d1 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -1504,6 +1504,18 @@ class RouteSetTest < Test::Unit::TestCase controller.send(:multi_url, 7, "hello", 5) end + def test_named_route_url_method_with_ordered_parameters_and_hash + controller = setup_named_route_test + assert_equal "http://named.route.test/people/go/7/hello/joe/5?baz=bar", + controller.send(:multi_url, 7, "hello", 5, :baz => "bar") + end + + def test_named_route_url_method_with_ordered_parameters_and_hash_ordered_parameters_override_hash + controller = setup_named_route_test + assert_equal "http://named.route.test/people/go/7/hello/joe/5?baz=bar", + controller.send(:multi_url, 7, "hello", 5, :foo => 666, :baz => "bar") + end + def test_draw_default_route ActionController::Routing.with_controllers(['users']) do set.draw do |map| -- cgit v1.2.3