From 4e3543b46749a83e4ccf1e9346b4dfe6d1a03233 Mon Sep 17 00:00:00 2001 From: Jamis Buck Date: Tue, 6 Jun 2006 19:09:56 +0000 Subject: Make sure named routes are never generated relative to some containing module git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4442 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/lib/action_controller/routing.rb | 4 ++-- actionpack/test/controller/routing_test.rb | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) (limited to 'actionpack') diff --git a/actionpack/lib/action_controller/routing.rb b/actionpack/lib/action_controller/routing.rb index a878e606ec..70c864646d 100644 --- a/actionpack/lib/action_controller/routing.rb +++ b/actionpack/lib/action_controller/routing.rb @@ -111,7 +111,7 @@ module ActionController args = "options, hash, expire_on = {}" # Nest the body inside of a def block, and then compile it. - method_decl = "def generate_raw(#{args})\path = begin\n#{body}\nend\n[path, hash]\nend" + method_decl = "def generate_raw(#{args})\npath = begin\n#{body}\nend\n[path, hash]\nend" # puts "\n======================" # puts # p self @@ -971,7 +971,7 @@ module ActionController # current controller module, if any. In other words, if we're currently # on admin/get, and the new controller is 'set', the new controller # should really be admin/set. - if expire_on[:controller] && options[:controller] && options[:controller][0] != ?/ + if !named_route && expire_on[:controller] && options[:controller] && options[:controller][0] != ?/ old_parts = recall[:controller].split('/') new_parts = options[:controller].split('/') parts = old_parts[0..-(new_parts.length + 1)] + new_parts diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index d33cf3c6b3..970bdc4a1a 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -1372,6 +1372,29 @@ class RouteSetTest < Test::Unit::TestCase {:controller => "welcome", :action => "get", :id => "7"}) assert_equal "/about", url end + + def test_generate_extras + set.draw { |map| map.connect ':controller/:action/:id' } + + args = { :controller => "foo", :action => "bar", :id => "7", :x => "y" } + assert_equal "/foo/bar/7?x=y", set.generate(args) + assert_equal ["/foo/bar/7", [:x]], set.generate_extras(args) + assert_equal [:x], set.extra_keys(args) + end + + def test_named_routes_are_never_relative_to_modules + set.draw do |map| + map.connect "/connection/manage/:action", :controller => 'connection/manage' + map.connect "/connection/connection", :controller => "connection/connection" + map.family_connection "/connection", :controller => "connection" + end + + url = set.generate({:controller => "connection"}, {:controller => 'connection/manage'}) + assert_equal "/connection/connection", url + + url = set.generate({:use_route => :family_connection, :controller => "connection"}, {:controller => 'connection/manage'}) + assert_equal "/connection", url + end end class RoutingTest < Test::Unit::TestCase -- cgit v1.2.3