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

时间:2009-12-07 22:13:38

标签: ruby-on-rails routes

现在我的用户个人资料网址如下:

http://example.com/users/joeschmoe

这指向用户控制器中的show方法。

我最喜欢做的是提供如下用户个人资料网址:

http://example.com/joeschmoe

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

5 个答案:

答案 0 :(得分:3)

我不同意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

答案 1 :(得分:2)

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

创建新的自定义路由

所以你的自定义路线就是......

map.connect 'u/:id', :controller => 'my/usercontroller', :action => 'someaction'

答案 2 :(得分:0)

在routes.rb中,这应该可以解决问题:

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

login 是传递给show方法的变量的名称。请务必将其放在所有其他控制器映射之后。

答案 3 :(得分:0)

嗯,您需要做的一件事是确保您的用户和控制器没有名称冲突。

一旦你这样做,你可以添加这样的路线:

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

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

答案 4 :(得分:0)

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

 resources :users, path: '' do 

 end