我正在尝试在 Rails 3 中编写一条包罗万象的路线,但我想在其中保留一些条款。我特别关注这篇文章中提出的示例,在 David Burrows 的回答中:使用 Rails 3 的动态路由
我使用的语法如下:
match '*path' => 'router#routing', :constraints => lambda{|req| (req.env["REQUEST_PATH"] =~ /(users|my-stuff)/).nil? }
现在,该语法工作得很好——如果用户访问路径中包含“user”或“my-stuff”的页面,它就会通过包罗万象进入特定位置。如果用户转到任何其他 URL,它会转到我的路由逻辑。
我的问题更多是关于可读性 - 有没有一种方法可以将路线与正则表达式以外的东西进行匹配?有没有办法提供一组匹配的术语?此外,有没有办法匹配路线的特定部分,而不是整个事情?
显然 Rails 有内置路由,但是这个项目要求对于某些路由,控制器不能出现在 URL 中。因此,包罗万象。
谢谢你的帮助
这是根据以下答案更新的路线文件:
class RouteConstraint
RESERVED_ROUTES = ['users', 'my-stuff']
def matches?(request)
!RESERVED_ROUTES.map {|r| request.path.include?(r)}.empty?
end
end
App::Application.routes.draw do
resources :categories
resources :sites
match '*path' => 'router#routing', :constraints => RouteConstraint.new
devise_for :users, :path_names =>{ :sign_in => 'login', :sign_out => 'logout', :registration => 'register' }
root :to => "router#routing"
end