4

2 種類の Rack ルートを作成しようとしています。Rack を使用すると、次のようにルートを記述できます。

app = Rack::URLMap.new('/test'  => SimpleAdapter.new,
                       '/files' => Rack::File.new('.'))

私の場合、これらのルートを処理したいと思います。

  • 「/」または「インデックス」
  • "/*" 他のルートと一致させるため

だから私はこれを試していました:

app = Rack::URLMap.new('/index' => SimpleAdapter.new,
                       '/'      => Rack::File.new('./public'))

これはうまくいきますが... 「/」パスを追加する方法がわかりません (「/index」パスの代替として)。私のテストによると、パス「/*」はワイルドカードとして解釈されません。どうすればできるか知っていますか?

ありがとう

4

1 に答える 1

3

パスをワイルドカードとしてRack::URLMap扱わないのは正しいです。'*'パスから正規表現への実際の変換は次のようになります。

Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')

つまり、パス内のすべての文字をリテラルとして扱いますが、任意のサフィックスを持つパスにも一致します。あなたが試みていることを達成する唯一の方法は、エンドポイントの代わりにミドルウェアを使用することだと思います。あなたconfig.ruには次のようなものがあるかもしれません:

use SimpleAdapter
run Rack::File

そして、あなたlib/simple_adapter.rbは次のように見えるかもしれません:

class SimpleAdapter
  SLASH_OR_INDEX = %r{/(?:index)?}
  def initialize(app)
    @app = app
  end
  def call(env)
    request = Rack::Request.new(env)
    if request.path =~ SLASH_OR_INDEX
      # return some Rack response triple...
    else
      # pass the request on down the stack:
      @app.call(env)
    end
  end
end
于 2010-06-18T13:39:07.247 に答える