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

Dex*_*Dex 1 regex routing ruby-on-rails omniauth

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

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

例如,mydomain.com/fl/miami很好.mydomain.com/auth/twitter不好.

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

Dex*_*Dex 6

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

match '/:state/:city' => 'cities#index', :as => :state_cities, :constraints => OmniauthPassThru.new
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 你的`matches?`中的`!request.fullpath.start_with?('//auth /')`可能会更好,也可以保留整个`/ auth`命名空间. (3认同)