具有不同配置的Sinatra :: Base应用程序的多个实例

时间:2012-08-14 15:14:02

标签: sinatra rack

我开发了基于Sinatra::Base的Rack应用程序。现在,我想在单个Rack应用程序中使用它的许多实例,每个实例的配置略有不同。

我的rackup应该是

use Rack::Lint

map '/mel' do
    run Site.new('/home/mel/site').app
end

map '/pub' do
    run Site.new('/pub').app
end

Site类收集各种参数(在此示例中仅显示根目录)并进行一些准备工作。 #app方法应返回一个Server对象,该对象包含对所提供的Site实例的引用。

这是SiteServer代码的示例:

class Site
    def initialize(root_dir)
        @root_dir = root_dir
        # ... set up things ...
    end

    def app
        # This is where a new Server Rack application should be created
        return Server.new { |server| server.set :site, self }
    end
end

class Server < Sinatra::Base
    before do
        @content = settings.site.all_files
    end

    get /(.*)/ do |url_path|
        # do things...
    end
end

此代码的问题是#app方法不会返回有效的Rack应用程序。

我应该在#app中做什么来返回新的,已配置的Server Rack应用程序?

1 个答案:

答案 0 :(得分:1)

这是让#sinatra上的“carloslopes”建议的方法。

Site#app方法变为

class Site
    def app
        # This is where a new Server object should be created
        return Server.new(self)
    end
end

并且Server个对象通过实例变量获取其参数:

class Server < Sinatra::Base
    def initialize(site)
        super()
        @site = site
    end

    before do
        @content = @site.all_files
    end

    get /(.*)/ do |url_path|
        # do things...
    end
end

编辑:制作社区维基,以便其他人可以更好地解决方案并分享信用。