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

发布于 2024-11-06 04:09:26 字数 396 浏览 1 评论 0原文

我正在寻找匹配路径中的模式 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 paths时却找不到它。

I'm looking to match the pattern state/city in the path, unless the state variable equals "auth"

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

For example, mydomain.com/fl/miami is good. mydomain.com/auth/twitter is bad.

I am using omniauth and it requires that you go to /auth/twitter for authentication, however it is nowhere to be found when I type rake routes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不离久伴 2024-11-13 04:09:26

根据 mu is Too Short 的评论,这是我得出的答案:

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

Based on mu is too short's comments, here is the answer I've come up with:

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
情归归情 2024-11-13 04:09:26

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

路由优先级

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

因此,这个命令应该做正确的事情:

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

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

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

这为将来的其他用途留下了顶层。

You should be able to define your /auth route before your state/city routes:

Route priority

Not all routes are created equally. Routes have priority defined by the order of appearance of the routes in the config/routes.rb file. The priority goes from top to bottom.

So this order should do the right thing:

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

You might want to avoid the problem altogether by putting your state/city routes into their own namespace:

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

That leaves the top level clear for other future uses.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文