# A simple example of mounting multiple Sinatra apps in config.ru # To run this example: # 1. put this code in a config.ru file # 2. run "shotgun" on the command line (http://github.com/rtomayko/shotgun) # 3. go to http://localhost:9393/ require 'sinatra/base' class MoonApp < Sinatra::Base get '/moon' do "Howard Moon" end # this action doesn't return an HTTP response -- it sets an env variable, # and passes, so that another action in this app or another app further # down the Rack pipeline has the opportunity to match this route as well get '/' do env['moon.message'] = "Hello from Moon" pass end end class NoirApp < Sinatra::Base get '/noir' do "Vince Noir" end get '/' do env['moon.message'] # set in MoonApp end end # We're mounting MoonApp as a middleware, and NoirApp as as an endpoint. # This makes sense, because MoonApp is in the middle of the chain, and NoirApp # is at the end of the line. MoonApp will be checked first for matching routes, # followed by NoirApp. use MoonApp run NoirApp # When a Sinatra app is run as a middleware, it will call the next app in the Rack # pipeline when a route is not matched, instead of raising a NotFound error. # For more on how this actually works, check out the code for the Rack::Builder # class and Sinatra::Base#initialize, #call! and #route_missing.