【问题标题】:Rack URL Mapping机架 URL 映射
【发布时间】:2011-02-01 19:44:36
【问题描述】:

我正在尝试编写两种 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' 路径的替代)。根据我的测试,路径 '/*' 不被解释为通配符。你知道我该怎么做吗?

谢谢

【问题讨论】:

    标签: ruby httpwebrequest routes rack


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2017-09-21
      • 2020-01-05
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多