所以我使用的Vanity gem处理我的网址中的所有params[:vname]
,并重定向到大多数vnames
的正确位置。
但我刚刚通过Omnipopulus添加身份验证 - https://github.com/icelab/omnipopulus - 它需要我去`mydomain.com/login'。
但是当我这样做时,它会将它发送给我的Vanities
控制器。以下是该请求的日志:
Started GET "/login" for 127.0.0.1 at 2011-09-18 16:39:15 -0500
Processing by VanitiesController#show as HTML
Parameters: {"vname"=>"login"}
Vanity Load (0.1ms) SELECT "vanities".* FROM "vanities" WHERE "vanities"."name" = 'login' LIMIT 1
Rendered public/404.html within layouts/application (0.0ms)
Completed 404 Not Found in 13ms (Views: 11.5ms | ActiveRecord: 0.3ms)
Vanities
控制器的作用是,当它获取mydomain.com/vname
的URL时,它会检查params中的值是否存在vname
记录(通常是用户名) )。如果找到一个,则重定向到该用户的show动作。但鉴于login
不是用户或用户名,它不应该处理该关键字的路由。
如何添加例外?
这是Vanities
控制器的路径:
controller :vanities do
match ':vname' => :show, :via => :get, :constraints => {:vname => /@?[A-Za-z0-9\-\+]+/}, :as => :vanity
end
答案 0 :(得分:0)
我之前从未使用过(或者甚至没有听过)这个gem,但查看其源代码,请参阅: https://github.com/icelab/omnipopulus/blob/master/config/routes.rb
这似乎将自己安装为Rails引擎,因此不在您的routes.rb文件中。我想在这里可能会有一些东西需要测试。
首先,要认识到虚荣的路线必须是路线文件中最后的绝对路线。这里发生的事情是,当您调用/登录时,虚拟机路由将在您的身份验证gem的路由被调用之前发生。通常情况下,我只是说,“将虚荣路线移到routes.rb中的最后一条路线”,但考虑到无所不能的基于其引擎注入其路线,这可能还不够。
我看到两种可能的解决方法:
我认为#2是一个丑陋的黑客,所以我真的希望#1首先工作(取决于带有捆绑器的宝石的加载顺序,我认为它会自上而下,但我没有任何证据证明这一点远)。