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

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

http://example.com/users/joeschmoe

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

我理想的做法是提供如下用户个人资料url:

http://example.com/joeschmoe

那么,什么样的路线和控制器魔法需要发生才能解决这个问题?

我不同意jcm对此的说法。 这根本不是一个糟糕的主意,并且被两个最大的社交网络Facebook和MySpace用于制作。

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

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

如果您想转到子域路由并将配置文件映射到http://username.example.com/这样的url,我建议使用SubdomainFu插件,结果路由如下所示:

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

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

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

 class User < ActiveRecord::Base validates_exclusion_of :username, :in => %w( messages posts blog forum admin profile ) … end 

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

所以你的自定义路线将是……

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

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

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

其中login是传递给show方法的变量的名称。 一定要把它放在所有其他控制器映射之后。

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

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

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

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

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

  resources :users, path: '' do end