From b22fe525e4c8d4e8cde2c3c7fefda68a994ab726 Mon Sep 17 00:00:00 2001 From: Matt Jones Date: Sat, 6 Sep 2008 16:03:23 -0400 Subject: [PATCH] 2-1-stable friendly routing fix Corrects a bug where routes.clear! did not reset generated code, leading to errors. Performance is unchanged from 2.1.0, much faster than trunk. --- .../routing/recognition_optimisation.rb | 12 +++++-- .../lib/action_controller/routing/route_set.rb | 5 ++- actionpack/test/controller/routing_test.rb | 30 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/actionpack/lib/action_controller/routing/recognition_optimisation.rb b/actionpack/lib/action_controller/routing/recognition_optimisation.rb index cf8f523..719b7c6 100644 --- a/actionpack/lib/action_controller/routing/recognition_optimisation.rb +++ b/actionpack/lib/action_controller/routing/recognition_optimisation.rb @@ -68,12 +68,16 @@ module ActionController end end - def recognize_optimized(path, env) - write_recognize_optimized - recognize_optimized(path, env) + def clear_recognize_optimized! + instance_eval %{ + def recognize_optimized(path, env) + write_recognize_optimized! + recognize_optimized(path, env) + end + }, __FILE__, __LINE__ end - def write_recognize_optimized + def write_recognize_optimized! tree = segment_tree(routes) body = generate_code(tree) instance_eval %{ diff --git a/actionpack/lib/action_controller/routing/route_set.rb b/actionpack/lib/action_controller/routing/route_set.rb index 5bc13cf..5bfbdbf 100644 --- a/actionpack/lib/action_controller/routing/route_set.rb +++ b/actionpack/lib/action_controller/routing/route_set.rb @@ -194,6 +194,7 @@ module ActionController def initialize self.routes = [] self.named_routes = NamedRouteCollection.new + clear_recognize_optimized! end # Subclasses and plugins may override this method to specify a different @@ -213,9 +214,9 @@ module ActionController named_routes.clear @combined_regexp = nil @routes_by_controller = nil - # This will force routing/recognition_optimization.rb + # This will force routing/recognition_optimisation.rb # to refresh optimisations. - @compiled_recognize_optimized = nil + clear_recognize_optimized! end def install_helpers(destinations = [ActionController::Base, ActionView::Base], regenerate_code = false) diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index b9af2b6..af2c213 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -671,6 +671,36 @@ class LegacyRouteSetTests < Test::Unit::TestCase x.send(:foo_with_requirement_url, "I am Against the requirements") end end + + def test_routes_changed_correctly_after_clear + ActionController::Base.optimise_named_routes = true + rs = ::ActionController::Routing::RouteSet.new + rs.draw do |r| + r.connect 'ca', :controller => 'ca', :action => "aa" + r.connect 'cb', :controller => 'cb', :action => "ab" + r.connect 'cc', :controller => 'cc', :action => "ac" + r.connect ':controller/:action/:id' + r.connect ':controller/:action/:id.:format' + end + + hash = rs.recognize_path "/cc" + + assert_not_nil hash + assert_equal %w(cc ac), [hash[:controller], hash[:action]] + + rs.draw do |r| + r.connect 'cb', :controller => 'cb', :action => "ab" + r.connect 'cc', :controller => 'cc', :action => "ac" + r.connect ':controller/:action/:id' + r.connect ':controller/:action/:id.:format' + end + + hash = rs.recognize_path "/cc" + + assert_not_nil hash + assert_equal %w(cc ac), [hash[:controller], hash[:action]] + + end end class SegmentTest < Test::Unit::TestCase -- 1.5.3.1