Method: ActionDispatch::Routing::RouteSet#recognize_path_with_request

Defined in:
actionpack/lib/action_dispatch/routing/route_set.rb

#recognize_path_with_request(req, path, extras, raise_on_missing: true) ⇒ Object

[View source]

900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
# File 'actionpack/lib/action_dispatch/routing/route_set.rb', line 900

def recognize_path_with_request(req, path, extras, raise_on_missing: true)
  @router.recognize(req) do |route, params|
    params.merge!(extras)
    params.each do |key, value|
      if value.is_a?(String)
        value = value.dup.force_encoding(Encoding::BINARY)
        params[key] = URI::DEFAULT_PARSER.unescape(value)
      end
    end
    req.path_parameters = params
    app = route.app
    if app.matches?(req) && app.dispatcher?
      begin
        req.controller_class
      rescue NameError
        raise ActionController::RoutingError, "A route matches #{path.inspect}, but references missing controller: #{params[:controller].camelize}Controller"
      end

      return req.path_parameters
    elsif app.matches?(req) && app.engine?
      path_parameters = app.rack_app.routes.recognize_path_with_request(req, path, extras, raise_on_missing: false)
      return path_parameters if path_parameters
    end
  end

  if raise_on_missing
    raise ActionController::RoutingError, "No route matches #{path.inspect}"
  end
end