5

我正在尝试在 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
4

2 回答 2

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

这个例子改编自rails routing guide

于 2011-10-07T13:55:38.710 回答
0

它需要一个 lambda;你可以使用任何你想要的标准。

于 2011-10-07T13:39:11.953 回答