私もこれが起こるのを見て驚いていますが、そうであるように、それは私たちにfilters
普遍的であることを示していると思います. それらはそうであるため、sinatra-contrib gem から使用してみてくださいSinatra::Namespace
。
require 'sinatra/namespace'
class App < Sinatra::Base
register Sinatra::Namespace
namespace "/" do
before do
# this will only run within routes marked "/",
# which should also be prepended with the mounted route,
# so "/streaming/"
end
get "/?" do
# something here
end
end
これが機能するかどうかは完全にはわかりません。ルートに末尾のスラッシュを含める必要があることを意味する可能性があるため、「/streaming/」ではなく「/streaming」(確実に回避策があります) ですが、少なくとも問題は解決する可能性があります。
アップデート
以下のコードをテストしたところ、フィルターは独自のアプリの URL に対してのみ実行されました。このコードでは、名前空間の部分も必要ないようです。メソッドを指定していることに気付きましたmount
が、それは Rack の一部ではありません。どのライブラリを使用していますか? ラックマウント?
require 'rubygems'
require 'bundler'
Bundler.require
require 'sinatra'
require 'sinatra/namespace'
class StreamingApp < Sinatra::Base
register Sinatra::Namespace
namespace "/" do
before do
warn "Entering Streaming before filter"
end
get "/?" do
"Hello from the StreamingApp"
end
end
namespace "/something" do
before do
warn "Entering Streaming's /something before filter"
warn "request.path_info = #{request.path_info}"
end
get "/?" do
"Hello from StreamingApp something"
end
end
end
class OtherApp < Sinatra::Base
before do
warn "Entering OtherApp before filter"
warn "request.path_info = #{request.path_info}"
end
get "/" do
"Hello from the OtherApp"
end
end
app = Rack::URLMap.new(
"/streaming" => StreamingApp,
"/" => OtherApp
)
run app
出力:
[2013-01-25 14:19:52] INFO WEBrick 1.3.1
[2013-01-25 14:19:52] INFO ruby 1.9.3 (2012-04-20) [x86_64-darwin10.8.0]
[2013-01-25 14:19:52] INFO WEBrick::HTTPServer#start: pid=78178 port=9292
Entering OtherApp before filter
request.path_info = /
127.0.0.1 - - [25/Jan/2013 14:20:03] "GET / HTTP/1.1" 200 23 0.0201
Entering Streaming before filter
request.path_info =
127.0.0.1 - - [25/Jan/2013 14:20:11] "GET /streaming HTTP/1.1" 200 27 0.0044
Entering Streaming before filter
request.path_info = /
127.0.0.1 - - [25/Jan/2013 14:20:15] "GET /streaming/ HTTP/1.1" 200 27 0.0016
Entering Streaming before filter
request.path_info = /something
Entering Streaming's /something before filter
request.path_info = /something
127.0.0.1 - - [25/Jan/2013 14:20:21] "GET /streaming/something HTTP/1.1" 200 33 0.0018
Namespace のドキュメントには発生しないと書かれていますが、両方のフィルターが StreamingApp で実行されることに注意してください。私はそこで何か悪いことをしたに違いない。