2017-01-27 14 views
1

は、私がラックにこれを持って言う:ラックに正確にマッチする "マップ"とは何ですか?

map '/great' do 
    run Test.new 
end 

このURLは素晴らしい作品:site.com/great/stuffが、これはしません:site.com/greatstuff。私はmapがarg名で始まるものと一致するはずだと読んだことがありますが、そうではないようです。

この仕組みに関する詳細な仕様はありますか?

+0

は私はわからないんだけど、私はそれが 'と任意の' '/素晴らしい/' 'サブフォルダ '/ /偉大な''一致したと思います。しかし、単に 'great'で始まるパスにはマッチしません。 –

+0

ええ、ドキュメントは本当に貧弱です。一致する正規表現がここにあるようです:https://github.com/rack/rack/blob/master/lib/rack/urlmap.rb – Anthony

答えて

5

この混乱は概念的なようです。

それは/great始まる試合パスを行います。つまり、/great/great//great/stuffなどです。 対応していないのは、の文字列で始まり、/greatで始まります。 /greatstuffのように。

/greatstuff/greatは完全に異なるパスです。パスをツリー構造と考えてください。


はベアボーンmap私の知る限りでを「マッチする文字列のパス」を行うための方法はありませんが、あなたは要求パスを見て、適切に派遣、独自のラックミドルウェアを追加することができます。


あなたは、実装を再確認したい場合は、ここでは2つの関連場所である:12、。

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] == ?/ 
+0

関連する文書は見つかりましたか?それも私の結論でしたが、私はソースコードを見て気にしませんでした。 –

+1

@EricDuminil、実装リファレンスが追加されました。 – ndn

関連する問題