要在我的应用上查看用户页面,您必须输入其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
答案 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)
你所询问的是被称为&#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做了两件非常好的事情:
- 它&#34;升级&#34; ActiveRecord
find
方法使用slug
列以及主键- 它允许您直接在链接助手
中引用被阻塞的对象 醇>
这基本上意味着你可以这样做:
<%= 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])