2012-08-14 25 views
0

我開發了基於Sinatra::Base的Rack應用程序。現在我想在一個Rack應用程序中使用它的很多實例,每個實例的配置略有不同。具有不同配置的Sinatra :: Base應用程序的多個實例

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機架應用?

回答

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 

編輯:由社區維基以便其他可以使解決方案更好的和分享信用。

相關問題