diff options
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rw-r--r-- | actionpack/lib/action_controller/routing.rb | 9 | ||||
-rw-r--r-- | actionpack/test/controller/routing_test.rb | 12 |
3 files changed, 22 insertions, 1 deletions
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| |