は、私がラックにこれを持って言う:ラックに正確にマッチする "マップ"とは何ですか?
map '/great' do
run Test.new
end
このURLは素晴らしい作品:site.com/great/stuff
が、これはしません:site.com/greatstuff
。私はmap
がarg名で始まるものと一致するはずだと読んだことがありますが、そうではないようです。
この仕組みに関する詳細な仕様はありますか?
は、私がラックにこれを持って言う:ラックに正確にマッチする "マップ"とは何ですか?
map '/great' do
run Test.new
end
このURLは素晴らしい作品:site.com/great/stuff
が、これはしません:site.com/greatstuff
。私はmap
がarg名で始まるものと一致するはずだと読んだことがありますが、そうではないようです。
この仕組みに関する詳細な仕様はありますか?
この混乱は概念的なようです。
それは/great
始まる試合パスを行います。つまり、/great
、/great/
、/great/stuff
などです。 対応していないのは、の文字列で始まり、/great
で始まります。 /greatstuff
のように。
/greatstuff
と/great
は完全に異なるパスです。パスをツリー構造と考えてください。
はベアボーンmap
私の知る限りでを「マッチする文字列のパス」を行うための方法はありませんが、あなたは要求パスを見て、適切に派遣、独自のラックミドルウェアを追加することができます。
あなたは、実装を再確認したい場合は、ここでは2つの関連場所である:1は2、。
Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')
これは基本的に一致させるために、そのパス(複数/
無視)で始まる文字列を必要とする経路から正規表現を作成します。別名:あなたが思っている場合には
to_regex('/foo/bar') # => /^\/+foo\/+bar(.*)/n
、n
フラグはASCIIへのエンコーディングを設定します。
文字列が一致する場合、さらにチェックが実行されます。つまり、一致するパスの残りの部分は存在しないか、/
で始まります。後者は、stuff
が/
で始まらないため、のようなものと/great
とは一致しません。
next unless !rest || rest.empty? || rest[0] == ?/
関連する文書は見つかりましたか?それも私の結論でしたが、私はソースコードを見て気にしませんでした。 –
@EricDuminil、実装リファレンスが追加されました。 – ndn
は私はわからないんだけど、私はそれが 'と任意の' '/素晴らしい/' 'サブフォルダ '/ /偉大な''一致したと思います。しかし、単に 'great'で始まるパスにはマッチしません。 –
ええ、ドキュメントは本当に貧弱です。一致する正規表現がここにあるようです:https://github.com/rack/rack/blob/master/lib/rack/urlmap.rb – Anthony