From 0c12d6c6dc66cb7873969fc7f982ad9244a4ea00 Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Tue, 20 Nov 2007 21:25:25 +0000 Subject: Ensure that the routing optimisation code isn't used when additional arguments are passed to the named route. Closes #10209 [bscofield, Koz] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8169 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/lib/action_controller/routing.rb | 14 ++++++++++---- actionpack/test/controller/routing_test.rb | 12 ++++++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/actionpack/lib/action_controller/routing.rb b/actionpack/lib/action_controller/routing.rb index bebad04eab..2e8951e36d 100644 --- a/actionpack/lib/action_controller/routing.rb +++ b/actionpack/lib/action_controller/routing.rb @@ -273,6 +273,8 @@ module ActionController HTTP_METHODS = [:get, :head, :post, :put, :delete] + ALLOWED_REQUIREMENTS_FOR_OPTIMISATION = [:controller, :action].to_set + # The root paths which may contain controller files mattr_accessor :controller_paths self.controller_paths = [] @@ -353,6 +355,7 @@ module ActionController @segments = [] @requirements = {} @conditions = {} + @optimise = true end # Indicates whether the routes should be optimised with the string interpolation @@ -1021,15 +1024,18 @@ module ActionController route.requirements = requirements route.conditions = conditions - # Routes cannot use the current string interpolation method - # if there are user-supplied :requirements as the interpolation - # code won't raise RoutingErrors when generating - route.optimise = !options.key?(:requirements) if !route.significant_keys.include?(:action) && !route.requirements[:action] route.requirements[:action] = "index" route.significant_keys << :action end + # Routes cannot use the current string interpolation method + # if there are user-supplied :requirements as the interpolation + # code won't raise RoutingErrors when generating + if options.key?(:requirements) || route.requirements.keys.to_set != Routing::ALLOWED_REQUIREMENTS_FOR_OPTIMISATION + route.optimise = false + end + if !route.significant_keys.include?(:controller) raise ArgumentError, "Illegal route: the :controller must be specified!" end diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index f2bd9f4301..5198efd8e6 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -212,11 +212,19 @@ class LegacyRouteSetTests < Test::Unit::TestCase rs.add_named_route :user, 'admin/user/:id', :controller=>'/admin/user', :action=>'show' x = setup_for_named_route x.expects(:url_for).never - # x.send(:users_url) + x.send(:users_url) x.send(:users_path) - # x.send(:user_url, 2, :foo=>"bar") + x.send(:user_url, 2, :foo=>"bar") x.send(:user_path, 3, :bar=>"foo") end + + def test_optimized_named_route_with_host + rs.add_named_route :pages, 'pages', :controller => 'content', :action => 'show_page', :host => 'foo.com' + x = setup_for_named_route + x.expects(:url_for).with(:host => 'foo.com', :only_path => false, :controller => 'content', :action => 'show_page', :use_route => :pages).once + x.send(:pages_url) + end + end def setup_for_named_route -- cgit v1.2.3