Class: Webmachine::Dispatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/webmachine/dispatcher.rb,
lib/webmachine/dispatcher/route.rb

Overview

Handles dispatching incoming requests to the proper registered resources and initializing the decision logic.

Defined Under Namespace

Classes: Route

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Dispatcher) initialize(resource_creator = method(:create_resource))

Initialize a Dispatcher instance

Parameters:

  • resource_creator (defaults to: method(:create_resource))

    Invoked to create resource instances.



21
22
23
24
# File 'lib/webmachine/dispatcher.rb', line 21

def initialize(resource_creator = method(:create_resource))
  @routes = []
  @resource_creator = resource_creator
end

Instance Attribute Details

- (Object) resource_creator

The creator for resources used to process requests. Must respond to call(route, request, response) and return a newly created resource instance.



17
18
19
# File 'lib/webmachine/dispatcher.rb', line 17

def resource_creator
  @resource_creator
end

- (Array<Route>) routes (readonly)

Returns the list of routes that will be dispatched to

Returns:

  • (Array<Route>)

    the list of routes that will be dispatched to

See Also:



12
13
14
# File 'lib/webmachine/dispatcher.rb', line 12

def routes
  @routes
end

Instance Method Details

- (Object) add_route(*args, &block) Also known as: add

Adds a route to the dispatch list. Routes will be matched in the order they are added.

See Also:

  • Route#new


29
30
31
32
33
# File 'lib/webmachine/dispatcher.rb', line 29

def add_route(*args, &block)
  route = Route.new(*args, &block)
  @routes << route
  route
end

- (Object) dispatch(request, response)

Dispatches a request to the appropriate Resource in the dispatch list. If a matching resource is not found, a “404 Not Found” will be rendered.

Parameters:

  • request (Request)

    the request object

  • response (Response)

    the response object



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/webmachine/dispatcher.rb', line 41

def dispatch(request, response)
  if resource = find_resource(request, response)
    Webmachine::Events.instrument('wm.dispatch') do |payload|
      Webmachine::Decision::FSM.new(resource, request, response).run

      payload[:resource] = resource.class.name
      payload[:request] = request.dup
      payload[:code] = response.code
    end
  else
    Webmachine.render_error(404, request, response)
  end
end

- (Object) find_resource(request, response)

Find the first resource that matches an incoming request

Parameters:

  • request (Request)

    the request to match

  • response (Response)

    the response for the resource



64
65
66
67
68
# File 'lib/webmachine/dispatcher.rb', line 64

def find_resource(request, response)
  if route = find_route(request)
    prepare_resource(route, request, response)
  end
end

- (Object) find_route(request)

Find the first route that matches an incoming request

Parameters:

  • request (Request)

    the request to match



72
73
74
# File 'lib/webmachine/dispatcher.rb', line 72

def find_route(request)
  @routes.find {|r| r.match?(request) }
end

- (Object) reset

Resets, removing all routes. Useful for testing or reloading the application.



57
58
59
# File 'lib/webmachine/dispatcher.rb', line 57

def reset
  @routes.clear
end