Rails 3:使所有路由更易于阅读和修改



我试图在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;

最新更新