aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/CHANGELOG2
-rw-r--r--actionpack/lib/action_controller/routing.rb9
-rw-r--r--actionpack/test/controller/routing_test.rb12
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|