Ruby on rails Rails路由/name而不是/users/:id

Ruby on rails Rails路由/name而不是/users/:id,ruby-on-rails,Ruby On Rails,我已经完成了Hartl的教程,正在尝试以twitter的方式创建到我的twitter克隆的虚荣URL,例如www.twitter.com/realDonaldTrump 我已经设法使我的URL看起来像/users/:slug。 想知道-我如何得到它,所以它只是/:slug 以下是我迄今为止所做的工作: 1.在我的用户模型中,没有“username”列,所以我使用了“name” 2.生成新迁移以向用户模型数据库添加slug列 3.插入rails控制台,通过键入以下内容为所有用户添加段塞: User

我已经完成了Hartl的教程,正在尝试以twitter的方式创建到我的twitter克隆的虚荣URL,例如www.twitter.com/realDonaldTrump

我已经设法使我的URL看起来像/users/:slug。 想知道-我如何得到它,所以它只是/:slug

以下是我迄今为止所做的工作:

1.在我的用户模型中,没有“username”列,所以我使用了“name”

2.生成新迁移以向用户模型数据库添加slug列

3.插入rails控制台,通过键入以下内容为所有用户添加段塞:

User.all.each do |user|
  user.slug = user.name.downcase.parameterize
  user.save
end
4.配置的UsersController显示操作:

def show
  @user = User.find_by_slug(params[:id])
  @microposts = @user.microposts.paginate(page: params[:page])
  redirect_to root_url and return unless @user.activated?
end
既然我已经对它进行了配置,所以它显示了/users/:slug,那么我该如何更改它,使它只是/:slug?

使用

get '/:slug', to: 'users#show'
在你的用户控制器上

def show
  @user = User.find_by slug: params[:slug]
...
end
不要忘记删除屏幕上的“:show” 在\操作之前:设置\用户,仅:[:显示,:编辑,:更新] 使用:id和非:slug来检索实例

请注意,在保存时必须担心模型中的slug唯一性

before_validation :set_slug    
validates :slug, uniqueness: true

private

def set_slug
...
end

get'/:slug',to:'users#show'
将此作为最后一条路线并检查

因为它是我们创建的命名路由,所以应该在最后创建,这样其他路由就不会受到干扰

在您的
用户控制器中

def show
  @user = User.find_by slug: params[:slug]
end
试试这个

编辑应用程序/模型/用户.rb

class User < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :slugged
end

User.create! name: "Username"
如果您正在向现有应用程序添加FriendlyId并且需要 要为现有用户生成slug,请从 控制台、运行程序或添加Rake任务:

User.find_each(&:save)
要获取/username而不是/users/username,请尝试此…

在您的用户模型中添加

class User < ActiveRecord::Base
  ...
  def to_param
    name
  end
  ...
end
请确保将这些路由放在路由文件的末尾


希望这对你有用。

将roue改为
get'/:id',改为:'users#show'
,这似乎有效,例如,我可以访问个人资料页/chloe schamberger。但是现在我不能访问我的任何其他页面。我得到一个错误:nil:NilClass def show@user=user.find_by_slug(params[:id])@microsopsts=@user.microsopsts.paginate(page:params[:page])的未定义方法“microsopsts”将_重定向到root_url并返回,除非@user.activated?endIt似乎每当我访问集合页面时,比如/users、/help、/about,路由都认为:id=users。如何修复此问题?最后将
get'/:slug'放到:'users#show'
此路由。似乎不适用于get'/:slug',但适用于'/:id'。有什么原因吗?还有,有些页面似乎不起作用。。例如,我的追随者页面。这是因为我必须将@user=user.find(params[:id])替换为user.find_by_slug(params[:id])?是的。。我可以访问像/users、/about、/contact这样的页面,但不能访问像users/example user/edit、users/example user/followers
get'/:id/edit',到:“users#edit'
尝试更改编辑路径,最后没有运气。说“找不到id=example User的用户”,并突出显示这一行:`@User=User.find(params[:id])`这需要友好的id,对吗?另外,我正在尝试获取/username而不是/users/username@JosephLiu:是的,这需要
gem'friendly\u id'
@JosephLiu:我已经更新了我的答案,请看一看。谢谢如果我安装了友好的\u id,是否应该更新到\u参数?我以为这就是我已经做过的
class User < ActiveRecord::Base
  ...
  def to_param
    name
  end
  ...
end
class UsersController < ApplicationController
  ...
  def show
    @user = User.find_by(name: params[:id])
  end
end
get ':id', to: 'users#show', as: 'show'
resources 'users', path: '/'