代码之家  ›  专栏  ›  技术社区  ›  Shpigford

如何路由用户配置文件URL以跳过控制器?

  •  4
  • Shpigford  · 技术社区  · 15 年前

    现在我的用户配置文件URL是这样的:

    http://example.com/users/joeschmoe

    这就指向 show 方法。

    理想情况下,我希望提供如下用户配置文件URL:

    http://example.com/joeschmoe

    那么,需要什么样的路线和控制器魔法来实现呢?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Steve Graham    15 年前

    我不同意JCM对此的看法。这根本不是一个糟糕的想法,它被Facebook和MySpace这两个最大的社交网络用于制作。

    匹配的路线 http://example.com/username 如下所示:

    map.connect ':username', :controller => 'users', :action => 'show'
    

    如果要转到子域路由并将配置文件映射到类似 http://username.example.com/ ,我建议使用SubDomainFu插件,生成的路由如下所示:

    map.root :controller => 'users', :action => 'show' , :conditions => {:subdomain => /.+/}
    

    在routes.rb中,应该最后定义这些广泛的、捕获所有的路由,这样它们的优先级最低,而更具体的路由将首先匹配。

    我还建议在用户模型中使用验证,以消除用户选择将与当前和未来路由冲突的用户名的可能性:

    class User < ActiveRecord::Base
      validates_exclusion_of :username, :in => %w( messages posts blog forum admin profile )
      …
    end
    
        2
  •  2
  •   Jim Mitchener    15 年前

    除非你没有控制器,否则这是没有意义的。如果要将控制器命名为与现有用户相同的名称,会发生什么情况?如果用户创建的用户名与您的某个控制器相同怎么办?这看起来是个糟糕的主意。如果您认为/user/太长,请尝试为/u创建新的自定义路由。/

    所以你的定制路线是…

    map.connect 'u/:id', :controller => 'my/usercontroller', :action => 'someaction'
    
        3
  •  0
  •   kibitzer    15 年前

    在routes.rb中,这应该可以做到:

    map.connect ":login", :controller => 'users', :action => 'show'
    

    在哪里? 登录 传递给Show方法的变量的名称。确保将其放在所有其他控制器映射之后。

        4
  •  0
  •   MattMcKnight    15 年前

    好吧,你需要做的一件事就是确保你不会与你的用户和控制器发生名称冲突。

    完成后,您可以添加这样的路线:

    map.connect ':username', :controller => 'users', :action => 'show'
    

    人们所做的另一件事是在Web服务器中使用子域并重写规则,以便 http://joeshmoe.example.com

        5
  •  0
  •   Engr. Hasanuzzaman Sumon    9 年前

    在Rails 4中,要从URL跳过控制器,必须添加 path: '' .

     resources :users, path: '' do 
    
     end