2011-06-27 19 views
17

Sinatra ile raf montajını kullanmakla ilgili bir sorum var. İki klasik tarzı Sinatra uygulamam var. App.rb'de tanımlanan bir Uygulamayı ve api.rb dosyasında tanımlanan diğer API'yi arayalım.Raf montajını kullanan birden çok Sinatra uygulaması

Bunu yapmak isterim ki, api.rb '/ api' ile başlayan tüm rotaları işler ve app.rb root ('/') dahil olmak üzere diğer tüm istekleri ele alır.

Bunu rafa takılı olarak nasıl kurarım? Yoksa bundan daha iyi bir çözüm var mı?

cevap

26

Sana Raf :: URLMap tercih edeceksiniz düşünüyorum - bu muhtemelen böyle bir şey olacaktır:

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

sizin config.ru dosyada gitmek gerektiğini.

+0

Teşekkürler! Bu parantezleri parantez olarak değiştirmeme rağmen harika çalışıyor. –

+1

Bununla birlikte dikkat ettiğim bir problem, "/ images", "/ javascripts" vb. Öğelerin, çalışmayan Sinatra tarafından işlenmesidir. Bunu nasıl halledebilirim? Bunu sadece 'ince' sunucu kullanarak fark ediyorum. –

+0

Orada yaşadığınız problem hakkında daha fazla bilgi verebilir misiniz? – daddz

3

Aynı problemi bir kez yaşadım ve bu yüzden bu şablonla geldim: sinatra-rspec-bundler-template Birden çok uygulama için tasarlandı.

İhtiyacınız olandan daha fazla özelliğe sahip olabilir, ancak "biraz daha" karmaşık bir şeye ihtiyacınız olduğunda size yardımcı olmalıdır.

9

Benzer bir sorunla karşılaştım ve Rack'a çok aşina değilim. Yukarıdaki cevaplara dayanarak ne yapacağımı anlayamadım. Son çözümüm, config.ru numaralı belgede yer almaktı.

Bu benim için mükemmel çalışıyor.

 
# 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

Bu kabul edilen cevap olmalı. Rack'u, Rack uygulamalarını tekrar tekrar oluşturmak için DSL sağlayan Rack :: Builder ad alanında yürütüldü ve Rack otomatik olarak Rack :: URLMap'i oluşturur. – 18augst

9

config.ru yılında da Sinatra'nın katman özellikten yararlanmak olabilir. Her biri kendi rotaları olan ve bunları aynı anda çalıştırmak isteyen birkaç Sinatra uygulamanız varsa, bunları istediğiniz sırada düzenleyebilirsiniz, örn.

# config.ru 
... 
use MyAppA 
use MyAppB 
use MyAppC 
run MyAppD 
İlgili konular