https://github.com/sinatra/sinatra/issues/1361を調査しているときに、別の問題だと思う次のことがわかりました。 この問題はSinatra1.4.8でも発生するため、これが仕様によるものかどうかはわかりませんが、予期しない動作が発生します。
要約すると、Sinatraは、最も具体的なルートの一致にパラメーターの解析を行わせ、それらの解析された値をフィルターに使用する必要があるという事実に帰着すると思います( before
)。 そうしないと、フィルター( before
)と動詞( get
、 post
など)の同じパラメーターに対して異なるパラメーター値が発生する可能性があります。
テストケース:
require 'minitest/autorun'
require 'sinatra/base'
require 'rack/test'
VALUES = {}
class App < Sinatra::Base
before '/foo/:bar/?:baz?' do
VALUES[:before] = params[:baz]
end
get '/foo/:bar/?:baz?/1' do
VALUES[:get] = params[:baz]
end
end
class NestedNamespacesTest < Minitest::Test
include Rack::Test::Methods
def app
App
end
def test_same_values
get "/foo/2017/1"
assert_equal VALUES[:before], VALUES[:get]
end
end
このテストは失敗します。つまり、 before
フィルターではbaz
は1
が、実際のルートではnil
ます。
まず、オプションのパラメータとして:bar/?
代わりに(/:bar)?
を使用する必要があります。
キャプチャされた名前はコンテキストによって異なります。 したがって、動作はバグではないと思います。
こんにちは@namusyaka返信ありがとうbaz
ではなく、 bar
です。 '/foo/:bar/?:baz?'
(例の名前がわかりにくいことをお詫びします)。 オプションのパラメータを定義する両方の方法は、同じ動作するようには思え/?:baz?
対(/?:baz)?
。 (/?:baz)?
変更しても、結果は変わりません。
キャプチャされた名前はコンテキストによって異なります
私は、文脈が最も具体的なルートであると主張します。 実際、それはreadmeが述べていることでもあります(または少なくともそれは私がそれを解釈する方法です):
ルートと同じコンテキスト内の各リクエストの前にフィルタが評価される前に、リクエストとレスポンスを変更できます。
バグであろうとなかろうと、私見では、フィルターがそのコンテキスト内から機能することが最も理にかなっています。 フィルタとルートの間でパラメータ値を変えたいコンテキストや状況を考えることができませんか?
この例では、オプションのパラメーターはbarではなくbazです。 '/ foo /:bar /?:baz?' (例の名前がわかりにくいことをお詫びします)。 オプションのパラメータを定義する両方の方法は同じように機能するようです/ ?: baz? 対(/?:baz)?. (/?:baz)に変更しますか? 異なる結果にはなりません。
ご迷惑をおかけして申し訳ありません。 オプションのパラメータは(/:foo)?
である必要があると言いたかったので、 mustermannのreadmeを参照してください。
バグであろうとなかろうと、私見では、フィルターがそのコンテキスト内から機能することが最も理にかなっています。 フィルタとルートの間でパラメータ値を変えたいコンテキストや状況を考えることができませんか?
実際、ルートとフィルターのパターンは必ずしも密接に関連しているわけではありません。
この動作は確立されています。
実際、ルートとフィルターのパターンは必ずしも密接に関連しているわけではありません。
この動作は確立されています。
うーん、いいよ。 私はそれを考慮しませんでした。 1回のリクエストでフィルターとルートでパラメーターの値が異なるのはまだ奇妙に感じます...
とにかく、これが機能するはずの方法である場合、実際にはバグではありません。 これを調査するために時間を割いてくれてありがとう! 処理済みと思われる場合は、この問題を自由にクローズしてください。
これはバグではないと思いますが、API設計について議論するためにこの問題を残しておきたいと思います。
@lvonkご報告ありがとうございます。
cc @zzak
最も参考になるコメント
これはバグではないと思いますが、API設計について議論するためにこの問題を残しておきたいと思います。
@lvonkご報告ありがとうございます。
cc @zzak