我试图在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
当你有多条路由需要尝试时,你可以使用一个类来指定约束:
class MyConstraint
BYPASSED_ROUTES = ['users', 'my-stuff']
def matches?(request)
BYPASSED_ROUTES.map {|r| request.path.include?(r)} .empty?
end
end
TwitterClone::Application.routes.draw do
match "*path" => "router#routing", :constraints => MyConstraint.new
end
这是一个lambda;