ruby - Rack URL 映射

标签 ruby httpwebrequest routes rack

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

谢谢

最佳答案

你是对的,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

关于ruby - Rack URL 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2534327/

相关文章:

ruby - 如何在 heroku 中使用自己的 mysql 数据库服务器?

ruby-on-rails - rails : get values of http response

http - 用 HTTP GET 请求设置 cookie 可以吗?

c# - 需要在 HttpWebResponse 中访问 HttpOnly cookie

node.js - Express:如何将请求传递给特定的处理程序?

ruby - 在 Ruby 中优化 "Multidimensional"数组

ruby - 如何包装采用可变长度参数的方法?

c# - 在循环内执行 Web 请求仅适用于第一遍

ruby-on-rails - rails : make custom URL helper behave like built in _path & _url helpers

node.js - 快速检测请求是否来自子域?