Rails 3:永久公开个人资料

我有/users/1作为公共用户配置文件(显示方法),但我想要/user_name而不是/users/1

如果我使用设计,我可以实现吗?

谢谢

编辑:我的节目控制器:

 # public profile page def show @user = User.find(params[:id]) end 

获取用户名到URL

你能行的。 Devise只是一种身份validation解决方案。 您可以按照自己的意愿行事。 以下是获取此URL行为所需步骤的概述。

  • 确保user_name对每个用户都是唯一的
  • 覆盖用户的to_param方法以返回user_name
  • 更改从数据库中获取用户的方式

这将在您的用户模型中

 class User < ActiveRecord::Base devise :database_authenticatable, :confirmable, :validatable validates_uniqueness_of :user_name def to_param user_name end end 

然后,在您的控制器中,执行以下操作:

 @user = User.find_by_user_name(params[:id]) 

user_path(@user)这样的助手使用to_param方法生成URL。

从URL中删除控制器

至于将路由从/user/:id更改为just /:id 。 这样的东西会起作用:

 match '/:id' => 'users#show', :as => :user 

在这里,您可以使用user_urluser_url因为:as => :user

但是你可以从阅读这些内容中受益:

如何在Rails应用程序中实现虚荣URL?

如何在rails中实现“短”嵌套虚荣URL?

当你这样做时,有很多事情要考虑。

如果你想通过用户名或id找到这样的东西应该工作:

 @user = User.find_by_username(params[:id]) || User.find_by_id(params[:id]) 

dontangg的答案大多是正确的,但是他的答案缺失了一些非常重要的事情。

首先,你绝对不应该使用直接用户名作为slu。 您需要以某种方式对它们进行规范化,并将某些slug黑名单以防止它们与您的资源或操作名称冲突,这在您使用URL时没有资源前缀时尤其重要。 因此,正如tee所指出的,第一步是使用slug生成库,而friendly_id目前是最好的。 其次,您需要将您的资源名称添加到friendly_id slug黑名单中,并处理在生成有问题的slug时抛出的exception。 您通常希望在可缓存模型上具有cached_slug属性,并且您需要在#to_param中公开它(例如, def to_param; cached_slug end )。 然后你需要更新你的发现者以检查slug,例如ModelName.where(:cached_slug => params[:id]).first

编辑:另外,WRT对另一个建议使用User.all答案的评论,记住User.all永远不应该在任何具有多个记录的表上使用。 您将整个表作为Ruby对象加载到内存中,并且可以轻松地使您的服务器停滞不前。