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 @klass = Journey::Router::Utils @required_parts = @route.required_parts @arg_size = @required_parts.size @optimized_path = @route.optimized_path end
def missing_keys(args)
def missing_keys(args) args.select{ |part, arg| arg.nil? || arg.empty? }.keys 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) params = Hash[parameterize_args(args)] missing_keys = missing_keys(params) unless missing_keys.empty? raise_generation_error(params, missing_keys) end @optimized_path.map{ |segment| replace_segment(params, segment) }.join end
def parameterize_args(args)
def parameterize_args(args) @required_parts.zip(args.map(&:to_param)) end
def raise_generation_error(args, missing_keys)
def raise_generation_error(args, missing_keys) constraints = Hash[@route.requirements.merge(args).sort] message = "No route matches #{constraints.inspect}" message << " missing required keys: #{missing_keys.sort.inspect}" raise ActionController::UrlGenerationError, message end
def replace_segment(params, segment)
def replace_segment(params, segment) Symbol === segment ? @klass.escape_segment(params[segment]) : segment end