Rails 3:使一个包罗万象的路线更容易阅读和修改

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)

Ben*_*ret 6

如果要在尝试多个路径时想要更清洁的东西,可以使用类来指定约束:

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)

此示例适用于导轨路由指南.