现在我的用户个人资料网址如下:
http://example.com/users/joeschmoe
这指向用户控制器中的show
方法。
我最喜欢做的是提供如下用户个人资料网址:
那么,什么样的路线和控制器魔法需要发生才能实现呢?
答案 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