@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'
。