我有一个开始有重复代码的 config.ru 文件:
map '/route1' do
run SampleApp.new
end
map '/route2' do
run SampleApp.new
end
我想把这个 config.ru 文件变成它自己的 Rack 应用程序,这样我所要做的就是:
map '/' do
run MyApp.new
end
创建自己的 Rack 应用程序的正确方法是什么?具体来说,我怎样才能创建一个类,以便我可以使用map
我的类中的方法来定义一堆路由?
解决方案:
这是一个有效的解决方案:
class MyApp
def initialize
@app = Rack::Builder.new do
# copy contents of your config.ru into this block
map '/route1' do
run SampleApp.new
end
map '/route2' do
run SampleApp.new
end
end
end
def call(env)
@app.call(env)
end
end
我之前尝试过这个,但无法让它工作,因为我试图将实例变量传递给map
块。例如:
def initialize
@sample_app = SampleApp.new
@app = Rack::Builder.new do
map '/route1' do
run @sample_app # will not work
end
end
end
这不起作用的原因是因为正在传递给的块正在实例map
的上下文中进行评估Rack::Builder
。
但是,如果我传递一个局部变量,它将起作用:
def initialize
sample_app = SampleApp.new
@app = Rack::Builder.new do
map '/route1' do
run sample_app # will work
end
end
end