我有一个关于在Sinatra中使用机架挂载的问题。 我有两个经典风格的Sinatra应用程序。 让我们称一个应用程序为 app.rb ,另一个为 API ,定义在 api.rb 中。
我希望 api.rb 处理所有以 '/api' 开头的路由,而app.rb则处理所有其他请求,包括根目录('/')。
我该如何使用 rack-mount 来设置这个呢?或者有没有更好的解决方案?
我认为你会更喜欢使用Rack::URLMap - 它可能看起来像这样:
run Rack::URLMap.new("/" => App.new,
"/api" => Api.new)
这应该放在你的config.ru
文件中。
我遇到了类似的问题,但对 Rack 不是很熟悉。基于上面的答案,我无法找出解决方法。我的最终解决方案是在 config.ru
中包含以下内容。
这对我来说非常完美。
# 主 Ramaze 站点 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
在config.ru
中,你也可以利用Sinatra的中间件功能。如果你有几个Sinatra应用程序,每个应用程序都有自己的路由,并且想要同时运行它们,你可以按照你希望它们被找到的顺序来安排它们,例如:
# config.ru
...
use MyAppA
use MyAppB
use MyAppC
run MyAppD
use Rack::Static, :urls => ["/images", "/javascripts", "/stylesheets"], :root => "public"
- Michael Irwinset:public,<your public dir>
。 [Sinatra Config](http://www.sinatrarb.com/configuration.html)中有关于此的所有细节。 - dunedain289