Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Simple rack router
branch: master

latest commit 5c415beeb2
@mynyml authored
Failed to load latest commit information.
examples Only return a route object when matching routes.
lib Only return a route object when matching routes.
test Port test suite to nanotest
.gitignore v0.9.8.1
LICENSE Initial commit
Manifest v0.9.8.1 Update README
Rakefile Update README
TODO v0.9.8.1


Small and simple standalone router, meant for use with Rack applications.


  • Familiar Sinatra-like DSL for defining actions
  • Modular architecture (see ROUTING ENGINES section)
  • No magic
  • Low level / Highly flexible
  • Simple code


class App
  include SimpleRouter::DSL

  get '/' do

  get '/archives/:year/:month/:day' do |year, month, day|
    Article.archived.find_by_date(year, month, day)

  def call(env)
    verb, path  = ENV['REQUEST_METHOD'], ENV['PATH_INFO']
    route = self.class.routes.match(verb, path)
    route.nil? ?
      [404, {'Content-Type' => 'text/html'}, '404 page not found'] :
      [200, {'Content-Type' => 'text/html'},*route.values)]

The SimpleRouter::DSL mixin provides 5 class methods:

#get, #post, #put, #delete and #routes

The four verb methods allow you to define actions that will match a request for the verb and route signature it defines.

The #routes method responds to #match and will return the first matching route (in order they were defined). The route returned is a simple object; for the second route in the example above, you get:

route.verb    #=> :get
route.path    #=> '/archives/:year/:month/:day'
route.action  #=> lambda {|year, month, day| Article.archived.find_by_date(year, month, day) }
route.values  #=> ['2008', '07', '01'] # after being matched with path '/archives/2008/07/01'

See examples/ directory for executable code examples.

Routing Engines

By design, the code is seperated in two main components:

  • DSL for defining routes/actions and retrieving requested action block.
  • Routing engine

Different engines can be used by assigning them to the router:

SimpleRouter.engine = UltraFastEngine

This allows, for instance, a new faster engine to be used by an app without changes in the top level DSL.

Engines can also allow route definitions to include more (or less!) features. For example, the built-in SimpleEngine allows route variables and extension handling. Others could add variable conditions (:id => Integer), mime-type restrictions, etc.

Engine Writers

Engines only need to conform to a simple interface. See lib/simple_router/engines/simple_engine.rb for details.

Something went wrong with that request. Please try again.