我开发了基于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
实例的引用。
这是Site
和Server
代码的示例:
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应用程序?
答案 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
编辑:制作社区维基,以便其他人可以更好地解决方案并分享信用。