我希望匹配路径中的模式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
进行身份验证,但是当我输入rake routes
时无处可寻。
答案 0 :(得分:6)
基于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
答案 1 :(得分:4)
您应该可以在州/城市路线之前定义/auth
路线:
并非所有路线都是平等创建的。路由的优先级由config / routes.rb文件中路由的出现顺序定义。优先级从上到下。
所以这个命令应该做正确的事情:
match '/auth/twitter' => ...
match '/:state/:city' => ...
您可能希望通过将州/城市路线放入其自己的命名空间来完全避免此问题:
match '/place/:state/:city' => ...
这使得最高级别可以用于其他未来用途。