更改用户参数以包含其用户名

要在我的应用上查看用户页面,您必须输入他们的ID /user/2

我怎样才能使它在params中使用username而不是用户显示页面的id值? 我希望它是/user/username/username

任何帮助,将不胜感激。 谢谢!

路线:

  get 'signup' => 'users#new' get 'login' => 'sessions#new' get 'logout' => 'sessions#destroy' get 'edit' => 'users#edit' get "/profile/:id" => "users#show" get "profile/:id/settings" => 'users#edit' get 'settings/:id' => 'users#settings' resources :users do resources :messages do post :new collection do get :askout end end collection do get :trashbin post :empty_trash end end 

用户控制器:

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

根据我的经验,我发现这样做的最简单方法是使用friendly_id gem。 ActiveRecord中有一个to_param方法,您可以设置定义模型的路径ID,但如果您要使用的属性不是URL友好的,那么它将变得非常复杂。 假设您的用户名不包含空格或其他URL“不友好”字符,您可以执行以下操作:

 class User < ActiveRecord::Base ... def to_param username end ... end 

但请确保在您的控制器中,您可以通过用户名找到用户。

 class UsersController < ApplicationController ... def set_user @user = User.find_by(username: params[:id]) end end 

请注意,如果to_param中的值与数据库中的值不to_param则再次查找对象将变得更加困难。 例如,如果您想使用name.parameterize设置像/users/john-doe这样的URL,当您的实际名称属性是John Doe ,您必须找到一种方法来始终“取消参数化”参数。 或者,您可以创建一个新的数据库列,其中包含您在URL中所需属性的唯一参数化字符串(称为slug)。 这就是我使用friendly_id的原因。 它可以半自动处理你的slu ..

至于将用户路由到/username ,您有以下几种选择:

  • get ':id', to: 'users#show', as: 'show'
  • resources 'users', path: '/'

只需确保将这些路由放在路径文件的末尾。 这样,如果你试图通过转到/some_other_model来访问SomeOtherModelsController上的index操作,它就不会试图找到一个用户名为“some_other_model”的用户。

有两种选择:

一世。 您可以使用gem friendly_id

II。 将to_param方法添加到您的用户模型并返回用户名

  class User < ActiveRecord::Base def to_param username end end 

使用此选项,您将不得不替换

  User.find(params[:id]) 

  User.find_by_username(params[:id]) 

Slugged Routes

你所询问的是一种叫做“slu”的路线。

这些是当您在应用程序中使用slug来确定要加载哪些对象时,而不是使用primary_key (通常是id

要在Rails中处理这个问题,你需要能够支持后端的slug ,最好的方法是使用friendly_id gem :


friendly_id

我强烈建议您使用friendly_id gem:

 #app/models/user.rb Class User < ActiveRecord::Base friendly_id :username, use: [:slugged, :finders] end 

friendly_id gem非常好地做了两件事:

  1. 它“升级”ActiveRecord find方法以使用slug列以及主键
  2. 它允许您直接在链接助手中引用被阻塞的对象

它基本上意味着你可以这样做:

 <%= link_to user.name, user %> 

如果使用friendly_id gem,这将自动填充表的slug属性

此外,它允许您执行其他操作 - 它使您能够以与以前完全相同的方式处理后端中的params[:id]选项 - 提供您需要的function。


路线

您应该按如下方式清理您的路线:

 #config/routes.rb get "/profile/:id" => "users#show" get "profile/:id/settings" => 'users#edit' get 'settings/:id' => 'users#settings' resources :sessions, only: [:new, :destroy], path_names: { new: "login", destroy: "logout" } resources :users, path_names: { new: "signup" } do resources :messages do post :new collection do get :askout end end collection do get :trashbin post :empty_trash end end 

在您的用户模型上创建一个新属性。 你可以称它为你想要的,但通常它被称为“slug”。

 rails g migration AddSlugToUser slug:string rake db:migrate 

在其中存储用户名的“url friendly”版本。 参数化方法对此有好处。

 class User < ActiveRecord::Base before_save :create_slug def create_slug self.slug = self.name.parameterize end 

在同一个模型中创建一个to_param方法,该方法将自动包含链接中的slug(而不是用户id)

 def to_param slug end 

最后,你在哪里做User.findfind_by_slug替换它

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