【发布时间】:2012-07-15 19:01:17
【问题描述】:
我的 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的块是evaluated in the context of a Rack::Builder instance。
但是,如果我传递一个局部变量,它将起作用:
def initialize
sample_app = SampleApp.new
@app = Rack::Builder.new do
map '/route1' do
run sample_app # will work
end
end
end
【问题讨论】:
-
只需在
#call方法中检查请求路径并添加条件语句 -
@injekt 你能提供一个例子吗?
-
在我的回答中查看我的示例,如果有帮助,我可以添加更多内容,但这是最基本的