多个Sinatra应用程序使用rack-mount

17

我有一个关于在Sinatra中使用机架挂载的问题。 我有两个经典风格的Sinatra应用程序。 让我们称一个应用程序为 app.rb ,另一个为 API ,定义在 api.rb 中。

我希望 api.rb 处理所有以 '/api' 开头的路由,而app.rb则处理所有其他请求,包括根目录('/')。

我该如何使用 rack-mount 来设置这个呢?或者有没有更好的解决方案?

4个回答

27

我认为你会更喜欢使用Rack::URLMap - 它可能看起来像这样:

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

这应该放在你的config.ru文件中。


谢谢!这很有效,尽管我不得不将方括号改为圆括号。 - Michael Irwin
1
我注意到这个问题,就是像“/images”,“/javascripts”等文件都被通过Sinatra处理,但是这并不起作用。我该怎么解决呢?我发现只有在使用“thin”服务器时才会出现这种情况。 - Michael Irwin
你能进一步阐述一下你遇到的问题吗? - scable
我最终使用了以下代码解决我的问题:use Rack::Static, :urls => ["/images", "/javascripts", "/stylesheets"], :root => "public" - Michael Irwin
抱歉,您还需要set:public,<your public dir>。 [Sinatra Config](http://www.sinatrarb.com/configuration.html)中有关于此的所有细节。 - dunedain289
显示剩余2条评论

10

我遇到了类似的问题,但对 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在Rack::Builder命名空间中执行,该命名空间提供DSL以迭代构建Rack应用程序,并且Rack自动构建Rack::URLMap。 - 18augst

9

config.ru中,你也可以利用Sinatra的中间件功能。如果你有几个Sinatra应用程序,每个应用程序都有自己的路由,并且想要同时运行它们,你可以按照你希望它们被找到的顺序来安排它们,例如:

# config.ru
...
use MyAppA
use MyAppB
use MyAppC
run MyAppD

3
我曾经遇到过同样的问题,因此我设计了这个模板:sinatra-rspec-bundler-template,适用于多个应用程序。
它可能具有比您需要的更多功能,但当您需要“稍微复杂一些”的东西时,它应该会对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接