这不起作用,因为@app
没有在正确的范围存在:
# in my_app.ru or any Rack::Builder context:
@app = self
map '/foo' do
use MyMiddleware
run lambda { |env| @app.call(env) }
end
但这会:
# in my_app.ru or any Rack::Builder context:
::MAIN_RACK_APP = self
map '/foo' do
use MyMiddleware
run lambda { |env| ::MAIN_RACK_APP.call(env) }
end
Rack::Builder
条的第一个参数map
关闭的前路径,所以它不会无休止地递归。不幸的是,这意味着在路径前缀被剥离之后,剩下的路径不太可能正确匹配其他映射。
下面是一个例子:
::MAIN_APP = self
use Rack::ShowExceptions
use Rack::Lint
use Rack::Reloader, 0
use Rack::ContentLength
map '/html' do
use MyContentTypeSettingMiddleware, 'text/html'
run lambda { |env| puts 'HTML!'; ::MAIN_APP.call(env) }
end
map '/xml' do
use MyContentTypeSettingMiddleware, 'application/xml'
run lambda { |env| puts 'XML!'; ::MAIN_APP.call(env) }
end
map '/' do
use ContentType, 'text/plain'
run lambda { |env| [ 200, {}, "<p>Hello!</p>" ] }
end
要/html/xml
导致以下去日志:
HTML!
XML!
127.0.0.1 - - [28/May/2009 17:41:42] "GET /html/xml HTTP/1.1" 200 13 0.3626
也就是说,应用程序映射到'/html'
前缀和呼叫的'/html'
条现在匹配映射到'/xml'
的应用程序。
愚蠢的错字 - 感谢纠正这一点,AnthonyWJones! ::挂在头: – 2009-05-28 15:04:10