class ActionDispatch::Routing::RouteSet::NamedRouteCollection::UrlHelper::OptimizedUrlHelper
:nodoc:
def call(t, args)
def call(t, args) if args.size == arg_size && !args.last.is_a?(Hash) && optimize_routes_generation?(t) options = @options.dup options.merge!(t.url_options) if t.respond_to?(:url_options) options[:path] = optimized_helper(args) ActionDispatch::Http::URL.url_for(options) else super end end
def initialize(route, options)
def initialize(route, options) super @path_parts = @route.required_parts @arg_size = @path_parts.size @string_route = @route.optimized_path end
def optimize_routes_generation?(t)
def optimize_routes_generation?(t) t.send(:optimize_routes_generation?) end
def optimized_helper(args)
def optimized_helper(args) path = @string_route.dup klass = Journey::Router::Utils @path_parts.zip(args) do |part, arg| parameterized_arg = arg.to_param if parameterized_arg.nil? || parameterized_arg.empty? raise_generation_error(args) end # Replace each route parameter # e.g. :id for regular parameter or *path for globbing # with ruby string interpolation code path.gsub!(/(\*|:)#{part}/, klass.escape_fragment(parameterized_arg)) end path end
def raise_generation_error(args)
def raise_generation_error(args) parts, missing_keys = [], [] @path_parts.zip(args) do |part, arg| parameterized_arg = arg.to_param if parameterized_arg.nil? || parameterized_arg.empty? missing_keys << part end parts << [part, arg] end message = "No route matches #{Hash[parts].inspect}" message << " missing required keys: #{missing_keys.inspect}" raise ActionController::UrlGenerationError, message end