Kev*_*ker 5 routes ruby-on-rails catch-all
我正试图在Rails 3中编写一个包罗万象的路线,但我想在其中保留一些术语.我特别关注这篇文章中提到的例子,在David Burrows的回答中:使用Rails 3的动态路由
我使用的语法如下:
match '*path' => 'router#routing', :constraints => lambda{|req| (req.env["REQUEST_PATH"] =~ /(users|my-stuff)/).nil? }
Run Code Online (Sandbox Code Playgroud)
现在,该语法工作得很好 - 如果用户在路径中访问带有"user"或"my-stuff"的页面,它将通过catch-all进入特定位置.如果用户转到任何其他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
Run Code Online (Sandbox Code Playgroud)
如果要在尝试多个路径时想要更清洁的东西,可以使用类来指定约束:
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
Run Code Online (Sandbox Code Playgroud)
此示例适用于导轨路由指南.
| 归档时间: |
|
| 查看次数: |
4780 次 |
| 最近记录: |