【问题标题】:Multiple Sinatra apps using rack-mount使用机架安装的多个 Sinatra 应用程序
【发布时间】:2011-09-23 16:43:36
【问题描述】:

我有一个关于在 Sinatra 中使用机架安装的问题。我有两个经典风格的 Sinatra 应用程序。让我们调用 app.rb 中定义的一个 App 和 api.rb 中定义的另一个 API。

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

如何使用机架安装进行设置?还是有比这更好的解决方案?

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    我想你会更喜欢 Rack::URLMap - 它可能看起来像这样:

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

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

    【讨论】:

    • 谢谢!这很好用,虽然我不得不将括号改为括号。
    • 不过,我注意到的一个问题是,“/images”、“/javascripts”等内容正在通过 Sinatra 进行处理,但无法正常工作。我怎样才能解决这个问题?我注意到这一点仅使用“瘦”服务器。
    • 您能否详细说明您遇到的问题?
    • 我最终使用它来解决我的问题:使用 Rack::Static, :urls => ["/images", "/javascripts", "/stylesheets"], :root => "公开”
    • 您也可以将set :static, true 添加到您的 Sinatra 应用程序中。
    【解决方案2】:

    我遇到了类似的问题,我对 Rack 不是很熟悉。根据上面的答案,我无法弄清楚该怎么做。我的最终解决方案是在config.ru 中包含以下内容。

    这对我来说非常适合。

    # Ramaze 主站点 地图“/”做 Encoding.default_external = 编码::UTF_8 Encoding.default_internal = 编码::UTF_8 需要 ::File.expand_path('../app', __FILE__) Ramaze.start(:root => __DIR__, :started => true) 运行拉马兹 结尾 # Sinatra & Grape API 地图“/api”做 使用 Rack::Static, :urls => ["/stylesheets", "/images", "/javascripts"], :root => "public" 使用 Rack::Session::Cookie 运行机架::Cascade.new([ MySinatraApp::应用程序, MySinatraApp::API]) 结尾

    【讨论】:

    • 这应该是公认的答案。在 Rack::Builder 命名空间中执行的文件 config.ru,提供 DSL 来迭代构建 Rack 应用,Rack 自动构建 Rack::URLMap。
    【解决方案3】:

    config.ru 中,您还可以利用 Sinatra 的中间件功能。如果您有多个 Sinatra 应用程序,每个应用程序都有自己的路线,并且想要同时运行它们,您可以按照您希望它们找到的顺序排列它们,例如

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

    【讨论】:

      【解决方案4】:

      我曾经遇到过同样的问题,所以我想出了这个模板:sinatra-rspec-bundler-template,它是为多个应用设计的。

      它可能具有比您需要的更多的功能,但当您需要“更”复杂的东西时,它应该可以帮助您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-24
        • 1970-01-01
        • 2017-03-25
        • 2013-01-03
        • 2011-07-21
        • 1970-01-01
        相关资源
        最近更新 更多