Permalink
Browse files

helpers should be a Set so it doesn't grow unbounded

since helpers is a set, we can be confident about when to remove methods
from the module.
  • Loading branch information...
1 parent 41931b8 commit 0088b08dcaf16176c8f9364d1d786f0c3728d369 @tenderlove tenderlove committed Jul 29, 2014
Showing with 12 additions and 4 deletions.
  1. +12 −4 actionpack/lib/action_dispatch/routing/route_set.rb
@@ -90,7 +90,7 @@ class NamedRouteCollection #:nodoc:
def initialize
@routes = {}
- @helpers = []
+ @helpers = Set.new
@module = Module.new
end
@@ -100,15 +100,19 @@ def helper_names
def clear!
@helpers.each do |helper|
- @module.remove_possible_method helper
+ @module.send :undef_method, helper
end
@routes.clear
@helpers.clear
end
def add(name, route)
- routes[name.to_sym] = route
+ key = name.to_sym
+ if routes.key? key
+ undef_named_route_methods @module, name
+ end
+ routes[key] = route
define_named_route_methods(@module, name, route)
end
@@ -256,7 +260,6 @@ def handle_positional_args(controller_options, inner_options, args, result, path
def define_url_helper(mod, route, name, opts, route_key, url_strategy)
helper = UrlHelper.create(route, opts, route_key, url_strategy)
- mod.remove_possible_method name
mod.module_eval do
define_method(name) do |*args|
options = nil
@@ -272,6 +275,11 @@ def define_named_route_methods(mod, name, route)
define_url_helper mod, route, :"#{name}_path", route.defaults, name, PATH
define_url_helper mod, route, :"#{name}_url", route.defaults, name, FULL
end
+
+ def undef_named_route_methods(mod, name)
+ mod.send :undef_method, :"#{name}_path"
+ mod.send :undef_method, :"#{name}_url"
+ end
end
# :stopdoc:

0 comments on commit 0088b08

Please sign in to comment.