如何在另一个Sinatra应用程序中安装Sinatra应用程序?

我正在尝试编写一个将组件组合在一起的Sinatra应用程序(有点像控制器)。 所以对于“博客”相关的东西,我想要一个名为Blog的应用程序安装在/blogBlog应用程序中包含的所有路由都与其安装的路径相关,因此我可以简单地定义index路径,而无需在路径中指定装载路径。

我最初通过使用config.ru文件并将路由map到不同的应用程序来处理此问题。 我遇到的问题是,我使用的是各种需要包含在所有应用程序中的各种sinatra gems / extensions / helper,因此有很多重复的代码。

如何在另一个应用程序中安装一个sinatra应用程序,以便应用程序中定义的路径相对于应用程序的安装位置? 如果这不可能是开箱即用的,你能否展示一个如何做到这一点的代码示例?

这是一个简单的例子:

 class App mount Blog, at: '/blog' mount Foo, at: '/bar' end class Blog get '/' do # index action end end class Foo get '/' do # index action end end 

请查看https://stackoverflow.com/a/15699791/335847 ,其中包含有关命名空间的一些想法。

就个人而言,我会使用config.ru与映射的路由。 如果你真的在这个空间“应该是一个单独的应用程序还是仅仅像这样组织它有用”它允许这样,然后你仍然可以自己移除其中一个应用程序,而无需更改代码(或只是一点点)。 如果你发现有很多重复的设置代码,我会做这样的事情:

 # base_controller.rb require 'sinatra/base' require "haml" # now come some shameless plugs for extensions I maintain :) require "sinatra/partial" require "sinatra/exstatic_assets" module MyAmazingApp class BaseController < Sinatra::Base register Sinatra::Partial register Sinatra::Exstatic end class Blog < BaseController # this gets all the stuff already registered. end class Foo < BaseController # this does too! end end # config.ru # this is just me being lazy # it'd add in the /base_controller route too, so you # may want to change it slightly :) MyAmazingApp.constants.each do |const| map "/#{const.name.downcase}" do run const end end 

以下是Sinatra Up and Running的引用:

不仅设置,而且Sinatra类的每个方面都将由其子类inheritance。 这包括已定义的路由,所有error handling程序, 扩展 ,中间件等。

它有一些使用这种技术(和其他)的好例子。 由于我处于无耻的插件模式,我推荐它,即使我与它无关! 🙂