Strelka::App::

Routing

module
Included Modules
Strelka::Constants
Extended With
Loggability
Strelka::Plugin

Sinatra-ish routing logic for Strelka::Apps

This plugin adds the ability to declare hooks for requests based on their attributes. The default router (Strelka::Router::Default) uses only the HTTP verb and the path, but you can also define your own router class if you want to include other attributes.

You declare a hook using the HTTP verb, followed by the path, followed by a Hash of options and a block that will be called when a matching request is handled.

When two or more hooks match the same request, the most-specific match wins. The mongrel2 route part of the path is stripped before comparing.

The hooks are given a Strelka::Request object, and are expected to return either a Strelka::Response or something that can be made into one.

Examples

class HelloWorld < Strelka::App

    plugins :routing

    # match any GET request
    get do |req|
        res = req.response
        res.puts 'Hello, World!'
        return res
    end

    # match any GET request whose path starts with '/goodbye'
    get '/goodbye' do |req|
        res = req.response
        res.puts "Goodbye, cruel World!"
        return res
    end

    # match any GET request whose path ends with '.pdf'
    get /\.pdf$/ do |req|
        res = req.response
        res.body = generate_pdf()
        return res
    end

end # class HelloWorld

Routing Strategies

The algorithm used to map requests to routes are defined by an object that implements the Strategy pattern. These routing strategies are pluggable, so if Mongrel2's the “longest-match wins” routing isn't to your taste, you can specify a different one using the router declaration. Strelka comes with one alternative “exclusive” router that implements a more restrictive mapping:

class ExclusiveHelloWorld < Strelka::App

    plugins :routing
    router :exclusive

    # match a GET request for the exact route only
    get do |req|
        res = req.response
        res.puts 'Hello, World!'
        return res
    end

    # only match a GET request for '/goodbye'
    get '/goodbye' do |req|
        res = req.response
        res.puts "Goodbye, cruel World!"
        return res
    end

   # Every other request responds with a 404

end # class ExclusiveHelloWorld

Custom Routers

See the Strelka::Router for information on how to define your own routing strategies.

Attributes

router[R]

The App's router object

Public Class Methods

anchor
new( * )

Create a new router object for each class with Routing.

# File lib/strelka/app/routing.rb, line 279
def initialize( * )
        super
        @router ||= Strelka::Router.create( self.class.routerclass, self.class.routes )
end

Public Instance Methods

anchor
handle_request( request, &block )

Dispatch the request using the Router.

# File lib/strelka/app/routing.rb, line 290
def handle_request( request, &block )
        self.log.debug "[:routing] Routing request using %p" % [ self.router.class ]

        if route = self.router.route_request( request )
                # Track which route was chosen for later plugins
                request.notes[:routing][:route] = route
                # Bind the action of the route and call it
                return super { route[:action].bind( self ).call( request, &block ) }
        else
                finish_with HTTP::NOT_FOUND, "The requested resource was not found on this server."
        end

        self.log.debug "[:routing] Done with routing."
end