我有一个关于在Sinatra上使用机架安装的问题。我有两个经典风格的Sinatra应用程序。让我们调用app.rb中定义的一个应用程序和api.rb中定义的另一个API。
我希望它能让api.rb处理以'/ api'开头的所有路由,而app.rb会处理所有其他请求,包括root('/')。
如何使用机架安装进行设置?或者有更好的解决方案吗?
答案 0 :(得分:27)
我认为你更喜欢Rack :: URLMap - 它可能看起来像这样:
run Rack::URLMap.new("/" => App.new,
"/api" => Api.new)
应该放在config.ru
文件中。
答案 1 :(得分:10)
我有类似的问题,我对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
答案 2 :(得分:9)
在config.ru
中,您还可以利用Sinatra的中间件功能。如果你有几个Sinatra应用程序,每个应用程序都有自己的路由,并且想要同时运行它们,你可以按照你想要的顺序排列它们,例如。
# config.ru
...
use MyAppA
use MyAppB
use MyAppC
run MyAppD
答案 3 :(得分:3)
我曾经遇到过同样的问题,所以我提出了这个模板:sinatra-rspec-bundler-template,它是为多个应用程序设置的。
它可能具有比您需要的功能更多的功能,但它可以在您需要“更复杂”的东西时帮助您。