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。如何更改?我更新了答案以包含有关如何更改的信息。从这里开始,您将如何为视图服务?不起作用。在我在回答中提供的示例中,用户
模型有一个属性用户名
,因此您可以这样做:
。