Rails 3路由中的负正则表达式约束

时间:2011-06-05 19:52:48

标签: regex ruby-on-rails-3 routing constraints

我有一些租赁列表,我希望可以作为RESTful资源访问,但也可以通过:area参数过滤索引,该参数可以是邻域或区域。鉴于“租赁”资源,我想要

/rentals

以及:根级别的区域参数过滤

/downtown
/westside
/some-neighborhood
etc.

我以为我可以通过将以下内容放在我的路径文件的底部附近来实现这一点:

resources :rentals
get ':area' => 'rentals#index', :area => /[a-zA-Z0-9\-]+/, :as => :area

但是当我添加Kaminari进行分页时,它会自动生成分页链接,看起来像

/rentals?area=downtown&page=2

当我宁愿让它看起来像

/downtown?page=2

为了让Kaminari使用指定的路由版本,:area param需要具有优先级,因此我将路由更改为:

get ':area' => 'rentals#index', :area => /(?!rentals)[a-zA-Z0-9\-]+/, :as => :area
resources :rentals

但是当我尝试在控制台中识别路线时,我得到:

ActionController::RoutingError: No route matches {:controller=>"rentals", :area=>"downtown"}

我不确定如何解决这个问题,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

您可以在路线约束中使用lambdas来解决此问题

match ':area' => 'rentals#index', :constraints => lambda{|req|  !req.env["REQUEST_URI"].include? "rentals"}