Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Sinatra apps using rack-mount

Tags:

ruby

sinatra

I have a question regarding using rack-mount with Sinatra. I've got two classic-style Sinatra apps. Let's call one App defined in app.rb and the other API defined in api.rb.

I would like it so that api.rb handles all routes beginning with '/api' and app.rb handles all other requests including the root ('/').

How would I set this up with rack-mount? Or is there a better solution than that?

like image 757
Michael Irwin Avatar asked Jun 27 '11 17:06

Michael Irwin


3 Answers

I think you'll prefer Rack::URLMap - it will probably look something like this:

run Rack::URLMap.new("/" => App.new, 
                     "/api" => Api.new)

That should go in your config.ru file.

like image 112
dunedain289 Avatar answered Oct 12 '22 00:10

dunedain289


I had a similar issue and I am not very familiar with Rack. I could not figure out what to do based on the answers above. My final solution was to have the following in config.ru.

This works perfectly for me.

# Main Ramaze site
map "/" do

    Encoding.default_external = Encoding::UTF_8
    Encoding.default_internal = Encoding::UTF_8

    require ::File.expand_path('../app', __FILE__)

    Ramaze.start(:root => __DIR__, :started => true)
    run Ramaze

end

# Sinatra & Grape API
map "/api" do

    use Rack::Static, :urls => ["/stylesheets", "/images", "/javascripts"], :root => "public"
    use Rack::Session::Cookie

    run Rack::Cascade.new([
        MySinatraApp::Application,
        MySinatraApp::API])

end
like image 24
Mullins Avatar answered Oct 12 '22 01:10

Mullins


In config.ru you could also take advantage of Sinatra's middleware feature. If you have several Sinatra apps, each with its own routes, and want to run them simultaneously, you can arrange them in the order you want them found, e.g.

# config.ru
...
use MyAppA
use MyAppB
use MyAppC
run MyAppD
like image 43
mrbcuda Avatar answered Oct 12 '22 01:10

mrbcuda