2011-06-27 5 views
17

Sinatraでのラックマウントの使用に関する質問があります。私はクラシックスタイルのSinatraアプリを2つ持っています。 app.rbで定義された1つのAppと、api.rbで定義された他のAPIを呼び出してみましょう。ラックマウントを使用した複数のSinatraアプリ

api.rbが '/ api'で始まるルートをすべて処理し、app.rbがルート( '/')を含む他のすべての要求を処理するようにしたいと思います。

これをラックマウントで設定するにはどうすればよいですか?それとももっと良い解決策がありますか?あなたのconfig.ruファイルに行くべき

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

: - 私はあなたがラックを好むと思う

答えて

26

:: URLMapそれはおそらく、このようになります。

+0

ありがとうございました!大括弧はかっこに変更する必要がありましたが、これは素晴らしいです。 –

+1

私はこれに気付いた問題の1つは、「画像」、「/ javascripts」などがSinatraを通して処理されていることです。どのように私はそれを回避することができますか?私はこれが「薄い」サーバーを使用していることに気付いています。 –

+0

あなたはあなたがそこにいる問題についてもっと詳しく説明できますか? – daddz

3

私は同じ問題を一度持っていたので、このテンプレートを考えました:sinatra-rspec-bundler-template複数のアプリケーションのためにレイアウトされています。

必要以上の機能があるかもしれませんが、「もう少し複雑な」ものが必要なときに役立ちます。

9

私は同様の問題がありましたが、私はRackにはあまりよく慣れていません。私は上記の答えに基づいて何をすべきかを理解できませんでした。私の最終的な解決策は、config.ruに次のように書かれていました。

これは私にとって完璧に機能します。

 
# 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 
+0

それは受け入れられた答えでなければなりません。ファイルconfig.ruはRack :: Builderネームスペースで実行され、DSLを提供してRackアプリケーションを繰り返し構築し、RackはRack :: URLMapを自動的に構築します。 – 18augst

9

config.ruでは、Sinatraのミドルウェア機能を利用することもできます。独自のルートを持ち、同時に実行したいSinatraアプリが複数ある場合は、見つけた順に並べ替えることができます。

# config.ru 
... 
use MyAppA 
use MyAppB 
use MyAppC 
run MyAppD 
関連する問題