Class: Webmachine::Dispatcher
- Inherits:
-
Object
- Object
- Webmachine::Dispatcher
- 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
Constant Summary collapse
- WM_DISPATCH =
'wm.dispatch'.freeze
Instance Attribute Summary collapse
-
#resource_creator ⇒ Object
The creator for resources used to process requests.
-
#routes ⇒ Array<Route>
readonly
The list of routes that will be dispatched to.
Instance Method Summary collapse
-
#add_route(*args, &block) ⇒ Object
(also: #add)
Adds a route to the dispatch list.
-
#dispatch(request, response) ⇒ Object
Dispatches a request to the appropriate Resource in the dispatch list.
-
#find_resource(request, response) ⇒ Object
Find the first resource that matches an incoming request.
-
#find_route(request) ⇒ Object
Find the first route that matches an incoming request.
-
#initialize(resource_creator = method(:create_resource)) ⇒ Dispatcher
constructor
Initialize a Dispatcher instance.
-
#reset ⇒ Object
Resets, removing all routes.
Constructor Details
#initialize(resource_creator = method(:create_resource)) ⇒ Dispatcher
Initialize a Dispatcher instance
23 24 25 26 |
# File 'lib/webmachine/dispatcher.rb', line 23 def initialize(resource_creator = method(:create_resource)) @routes = [] @resource_creator = resource_creator end |
Instance Attribute Details
#resource_creator ⇒ Object
The creator for resources used to process requests. Must respond to call(route, request, response) and return a newly created resource instance.
19 20 21 |
# File 'lib/webmachine/dispatcher.rb', line 19 def resource_creator @resource_creator end |
#routes ⇒ Array<Route> (readonly)
Returns the list of routes that will be dispatched to.
14 15 16 |
# File 'lib/webmachine/dispatcher.rb', line 14 def routes @routes end |
Instance Method Details
#add_route(*args, &block) ⇒ Object Also known as: add
Adds a route to the dispatch list. Routes will be matched in the order they are added.
31 32 33 34 35 |
# File 'lib/webmachine/dispatcher.rb', line 31 def add_route(*args, &block) route = Route.new(*args, &block) @routes << route route end |
#dispatch(request, response) ⇒ Object
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.
43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/webmachine/dispatcher.rb', line 43 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 |
#find_resource(request, response) ⇒ Object
Find the first resource that matches an incoming request
66 67 68 69 70 |
# File 'lib/webmachine/dispatcher.rb', line 66 def find_resource(request, response) if route = find_route(request) prepare_resource(route, request, response) end end |
#find_route(request) ⇒ Object
Find the first route that matches an incoming request
74 75 76 |
# File 'lib/webmachine/dispatcher.rb', line 74 def find_route(request) @routes.find {|r| r.match?(request) } end |
#reset ⇒ Object
Resets, removing all routes. Useful for testing or reloading the application.
59 60 61 |
# File 'lib/webmachine/dispatcher.rb', line 59 def reset @routes.clear end |