Rails 3路由约束和正则表达式

我希望匹配路径中的模式state/city ,除非状态变量等于“auth”

 match '/:state/:city' => 'cities#index', :as => :state_cities, :constraints => {:state => /(?!auth)/ } 

例如, mydomain.com/fl/miami很好。 mydomain.com/auth/twitter很糟糕。

我正在使用omniauth,它要求你去/auth/twitter进行身份validation,但是当我输入rake routes时无处可寻。

根据mu太短的评论,这是我提出的答案:

 match '/:state/:city' => 'cities#index', :as => :state_cities, :constraints => OmniauthPassThru.new 

LIB / omniauth_pass_thru.rb

 class OmniauthPassThru def initialize @passthru = ["/auth/facebook", "/auth/twitter"] end def matches?(request) return false if @passthru.include?(request.fullpath) true end end 

您应该能够在州/城市路线之前定义/auth路线:

路线优先

并非所有路线都是平等创建的。 路由的优先级由config / routes.rb文件中路由的出现顺序定义。 优先级从上到下。

所以这个订单应该做正确的事情:

 match '/auth/twitter' => ... match '/:state/:city' => ... 

您可能希望通过将州/城市路由放入其自己的命名空间来完全避免此问题:

 match '/place/:state/:city' => ... 

这使得最高级别可以用于其他未来用途。