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

时间:2011-05-09 00:54:29

标签: ruby-on-rails regex routing omniauth

我希望匹配路径中的模式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时无处可寻。

2 个答案:

答案 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路线:

  

Route priority

     

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

所以这个命令应该做正确的事情:

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

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

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

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

相关问题