Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Stackable dynamic tree based Rack router

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 test
Octocat-spinner-32 .gitignore
Octocat-spinner-32 .travis.yml
Octocat-spinner-32 Gemfile
Octocat-spinner-32 LICENSE
Octocat-spinner-32 README.rdoc
Octocat-spinner-32 Rakefile
Octocat-spinner-32 rack-mount.gemspec
README.rdoc

Rack::Mount

A stackable dynamic tree based Rack router.

Rack::Mount supports Rack's X-Cascade convention to continue trying routes if the response returns pass. This allows multiple routes to be nested or stacked on top of each other. Since the application endpoint can trigger the router to continue matching, middleware can be used to add arbitrary conditions to any route. This allows you to route based on other request attributes, session information, or even data dynamically pulled from a database.

Usage

Rack::Mount provides a plugin API to build custom DSLs on top of.

The API is extremely minimal and only 3 methods are exposed as the public API.

Rack::Mount::RouteSet#add_route

builder method for adding routes to the set

Rack::Mount::RouteSet#call

Rack compatible recognition and dispatching method

Rack::Mount::RouteSet#generate

generates a route condition from identifiers or significant keys

Example

require 'rack/mount'

Routes = Rack::Mount::RouteSet.new do |set|
  # add_route takes a rack application and conditions to match with
  #
  # valid conditions methods are any method on Rack::Request
  # the values to match against may be strings or regexps
  #
  # See Rack::Mount::RouteSet#add_route for more options.
  set.add_route FooApp, { :request_method => 'GET', :path_info => %r{^/foo$} }, {}, :foo
end

# The route set itself is a simple rack app you mount
run Routes

# generate path for route named "foo"
Routes.generate(:path_info, :foo) #=> "/foo"
Something went wrong with that request. Please try again.