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

时间:2014-08-06 19:23:13

标签: ruby-on-rails

要在我的应用上查看用户页面,您必须输入其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

4 个答案:

答案 0 :(得分:2)

根据我的经验,我发现这样做的最简单方法是使用friendly_id宝石。 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中的值与数据库中的值不完全相同,那么再次找到对象会更加困难。例如,如果您希望在实际名称属性为name.parameterize时使用/users/john-doe设置包含John Doe的网址,那么您必须找到一种始终如一的方式&#34 ; deparameterize&#34;你的参数。或者,您可以创建一个新的数据库列,其中包含您在URL中所需属性的唯一参数化字符串(称为slug)。这就是我使用friendly_id的原因。它可以半自动处理你的slu ..

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

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

请确保将这些路线放在路线文件的末尾。这样,如果您尝试通过index转到SomeOtherModelsController上的/some_other_model操作,则不会尝试使用用户名&#34; some_other_model&找到您的用户#34 ;.

答案 1 :(得分:1)

有两种选择:

我。您可以使用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])

答案 2 :(得分:1)

Slugged Routes

你所询问的是被称为&#34; slugged&#34;路由。

这些是您在应用程序中使用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. 它&#34;升级&#34; ActiveRecord find方法使用slug列以及主键
  2.   
  3. 它允许您直接在链接助手
  4. 中引用被阻塞的对象   

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

<%= link_to user.name, user %> 

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

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


<强>路线

您应该按照以下方式清理路线:

#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

答案 3 :(得分:-1)

在您的用户模型上创建一个新属性。你可以称它为你想要的,但通常它被称为“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.find将其替换为find_by_slug

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