Ruby on rails Rails 3:Permalink公共配置文件

Ruby on rails Rails 3:Permalink公共配置文件,ruby-on-rails,rubygems,ruby-on-rails-3,devise,Ruby On Rails,Rubygems,Ruby On Rails 3,Devise,我有/users/1作为公共用户配置文件(show方法),但我希望有/user\u name而不是/users/1 如果我使用Desive,我能做到吗 谢谢 编辑: 我的节目主持人: # public profile page def show @user = User.find(params[:id]) end 如果您想通过用户名或id查找类似的内容,应该可以: @user = User.find_by_username(params[:id]) || User.find_b

我有
/users/1
作为公共用户配置文件(show方法),但我希望有
/user\u name
而不是
/users/1

如果我使用Desive,我能做到吗

谢谢

编辑: 我的节目主持人:

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

如果您想通过用户名或id查找类似的内容,应该可以:

@user = User.find_by_username(params[:id]) || User.find_by_id(params[:id])
match '/:id' => 'users#show', :as => :user
将用户名输入URL 你能做到。Desive只是一个身份验证解决方案。您的其他控制器可以按照您的要求进行操作。下面概述了获取此URL行为所需的步骤

  • 确保
    user\u name
    对于每个用户都是唯一的
  • 重写用户的
    to_param
    方法以返回
    用户名
  • 更改从数据库获取用户的方式
这会出现在您的用户模型中

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

  def to_param
    user_name
  end

end
user\u path(@user)
这样的帮助程序使用
to\u param
方法生成URL

从URL中删除控制器 至于将路由从
/user/:id
更改为仅
/:id
。类似这样的方法会奏效:

@user = User.find_by_username(params[:id]) || User.find_by_id(params[:id])
match '/:id' => 'users#show', :as => :user
由于
:as=>:user

但您可能会从以下内容中受益:


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

唐唐的答案基本上是正确的,但是他的答案遗漏了一些非常重要的事情

首先,绝对不应该对slug使用直接的用户名。您需要以某种方式对它们进行规范化,并将某些slug列入黑名单,以防止它们与您的资源或操作名称冲突,当您在URL中不使用资源前缀的情况下使用它们时,这一点尤为重要。因此,正如tee所指出的,第一步是使用slug生成库,而friendly_id是目前最好的。其次,您需要将您的资源名称添加到友好的_id slug黑名单中,并处理在生成违规slug时引发的异常。您通常希望在sluggable模型上有一个
cached_slug
属性,并且需要在#to_param中公开该属性(例如,
def to_param;cached_slug end
)。然后需要更新查找程序以检查slug,例如
ModelName.where(:cached\u slug=>params[:id])。首先


编辑:另外,在另一个建议使用
User.all
的答案上写下评论。记住
。all
不应用于任何记录数超过少数的表。您可以将整个表作为Ruby对象加载到内存中,并可以轻松地使服务器停止。

类似于/users/username。我只需要/username。谢谢啊,是的,错过了。在这种情况下,我在routes.rb文件的末尾设置了一个路由,比如:map.user_profile'/:id',:controller=>:users,:action=>'show',:id=>/[a-zA-Z0-9\-\u]*/在:id上的条件有助于其他路由。然后,您只需要确保您的show操作执行类似于渲染404的操作,或者在找不到用户时重定向home。您还可以在routes.rb文件User.all.each |{User | map.connect”/#{User.username},:controller=>'users',:action=>'show'}中准确生成所需的路由,但它不是动态的。@njorden,谢谢您,但是,如果我使用该路由,我的所有其他/routes都将不起作用,它将始终在/dashboard中搜索用户,etc路线。如果你把它放在路线文件的最后,它就不应该……它应该首先匹配任何其他路线,如果没有其他路线匹配,则只匹配/:id。伙计,我正忙着编辑我的答案。。。njorden是对的。它将匹配最后一条路线。但是,使用
map.user\u profile
语法将很快被弃用。您应该使用
match'/:id'=>'users#show',:constraints=>{:id=>/[a-zA-Z0-9\-\uz]*/},:as=>:user\u profile
来做同样的事情,因为您现在正在使用Rails 3。这很有效,但我不想要/users/user\u name,我想要/user\u name。如何更改?我更新了答案以包含有关如何更改的信息。从这里开始,您将如何为视图服务?不起作用。在我在回答中提供的示例中,
用户
模型有一个属性
用户名
,因此您可以这样做: