1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Refactor define_url_helper to share the same instance between _path and _url

Before this patch each named routes generates two UrlHelper instances.
Both are almost identical, their only difference is the `url_strategy`
property.

This patch get rid of that property and instead pass it as an argument
to call, so effectively it's stored in the closure.
This commit is contained in:
Jean Boussier 2019-09-06 14:23:38 +02:00
parent a43de73841
commit 7b53016b98

View file

@ -110,8 +110,10 @@ module ActionDispatch
@url_helpers_module.undef_method url_name
end
routes[key] = route
define_url_helper @path_helpers_module, route, path_name, route.defaults, name, PATH
define_url_helper @url_helpers_module, route, url_name, route.defaults, name, UNKNOWN
helper = UrlHelper.create(route, route.defaults, name)
define_url_helper @path_helpers_module, path_name, helper, PATH
define_url_helper @url_helpers_module, url_name, helper, UNKNOWN
@path_helpers << path_name
@url_helpers << url_name
@ -169,11 +171,11 @@ module ActionDispatch
end
class UrlHelper
def self.create(route, options, route_name, url_strategy)
def self.create(route, options, route_name)
if optimize_helper?(route)
OptimizedUrlHelper.new(route, options, route_name, url_strategy)
OptimizedUrlHelper.new(route, options, route_name)
else
new route, options, route_name, url_strategy
new(route, options, route_name)
end
end
@ -181,18 +183,18 @@ module ActionDispatch
route.path.requirements.empty? && !route.glob?
end
attr_reader :url_strategy, :route_name
attr_reader :route_name
class OptimizedUrlHelper < UrlHelper
attr_reader :arg_size
def initialize(route, options, route_name, url_strategy)
def initialize(route, options, route_name)
super
@required_parts = @route.required_parts
@arg_size = @required_parts.size
end
def call(t, args, inner_options)
def call(t, args, inner_options, url_strategy)
if args.size == arg_size && !inner_options && optimize_routes_generation?(t)
options = t.url_options.merge @options
options[:path] = optimized_helper(args)
@ -249,15 +251,14 @@ module ActionDispatch
end
end
def initialize(route, options, route_name, url_strategy)
def initialize(route, options, route_name)
@options = options
@segment_keys = route.segment_keys.uniq
@route = route
@url_strategy = url_strategy
@route_name = route_name
end
def call(t, args, inner_options)
def call(t, args, inner_options, url_strategy)
controller_options = t.url_options
options = controller_options.merge @options
hash = handle_positional_args(controller_options,
@ -312,8 +313,7 @@ module ActionDispatch
#
# foo_url(bar, baz, bang, sort_by: 'baz')
#
def define_url_helper(mod, route, name, opts, route_key, url_strategy)
helper = UrlHelper.create(route, opts, route_key, url_strategy)
def define_url_helper(mod, name, helper, url_strategy)
mod.define_method(name) do |*args|
last = args.last
options = \
@ -323,7 +323,7 @@ module ActionDispatch
when ActionController::Parameters
args.pop.to_h
end
helper.call self, args, options
helper.call(self, args, options, url_strategy)
end
end
end