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_url
和user_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对象加载到内存中,并且可以轻松地使您的服务器停滞不前。