在Rails的routes.rb中使用尾部斜杠匹配URL

时间:2013-02-04 21:50:01

标签: ruby-on-rails url-routing

有没有办法在Rails的routes.rb中执行不同的路由,具体取决于请求URL是否有尾部斜杠?这看起来很困难,因为请求对象的尾部斜杠已被删除,这意味着http://www.example.com/about/的GET的request.url值为http://www.example.com/about。该行为会阻止使用request-based constraints以及route-globbing进行匹配。

1 个答案:

答案 0 :(得分:1)

我发现的一个解决方案是使用request.env [“REQUEST_URI”],其中包含随请求提交的原始URL。不幸的是,由于它不是请求的直接字符串属性,因此需要custom matching object

class TrailingSlashMatcher
  def matches?(request)
    uri = request.env["REQUEST_URI"]
    !!uri && uri.end_with?("/")
  end
end

AppName::Application.routes.draw do
  match '/example/*path', constraints: TrailingSlashMatcher.new, to: redirect("/somewhere/")
end

这看起来有点矫枉过正,所以希望有人有更优雅的方法。