0

我开发了一个基于Sinatra::Base. 现在我想在单个 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才能返回一个新的、已配置的ServerRack 应用程序?

4

1 回答 1

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

编辑:制作社区 wiki,以便其他人可以使解决方案变得更好并分享功劳。

于 2012-08-14T16:37:03.153 回答