在使用Vanity gem时,如何为我的路径文件添加一些虚荣名称的异常?

时间:2011-09-18 21:48:20

标签: ruby-on-rails ruby-on-rails-3 routing ruby-on-rails-3.1

所以我使用的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

1 个答案:

答案 0 :(得分:0)

我之前从未使用过(或者甚至没有听过)这个gem,但查看其源代码,请参阅: https://github.com/icelab/omnipopulus/blob/master/config/routes.rb

这似乎将自己安装为Rails引擎,因此不在您的routes.rb文件中。我想在这里可能会有一些东西需要测试。

首先,要认识到虚荣的路线必须是路线文件中最后的绝对路线。这里发生的事情是,当您调用/登录时,虚拟机路由将在您的身份验证gem的路由被调用之前发生。通常情况下,我只是说,“将虚荣路线移到routes.rb中的最后一条路线”,但考虑到无所不能的基于其引擎注入其路线,这可能还不够。

我看到两种可能的解决方法:

  1. 查看Gemfile并确保在无所不在之后加载虚荣。
  2. 如果失败,请将我在上面发布的链接中的路线复制到routes.rb之前的虚荣路线。
  3. 我认为#2是一个丑陋的黑客,所以我真的希望#1首先工作(取决于带有捆绑器的宝石的加载顺序,我认为它会自上而下,但我没有任何证据证明这一点远)。