2010-03-28 3 views
4

Я пытаюсь написать два типа маршрутов Rack. Стойки позволяют писать такие маршруты, как так:Отображение URL-адресов в стойке

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

В моем случае, я хотел бы обрабатывать эти маршруты:

  • «/» или «индекс»
  • «/ *» в для того, чтобы соответствовать любым другим маршрутам

Так я пытаюсь это:

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

Это работает хорошо, но ... Я не знаю, как добавить путь '/' (в качестве альтернативы пути '/ index'). По моим испытаниям путь '/ *' не интерпретируется как подстановочный знак. Вы знаете, как я могу это сделать?

Благодаря

ответ

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 
Смежные вопросы