这是场景。假设我的rails应用程序中的每个用户帐户在其分配的ID之上具有唯一的用户句柄,我如何修改路径(或其他)以便
/users/1
/users/johnsmith
是否会显示标识为1
且用户处理'johnsmith'
的用户?
我目前通过在我的用户控制器中使用get_user方法实现如下操作,我在控制器操作之前调用该方法:
def get_user
identifier = params[:id]
if identifier.to_i.to_s == identifier # if numeric id
@user = User.find(identifier)
else # else hande
@user = User.find_by(handle: identifier)
end
end
在Rails中执行此操作是否有更优雅的解决方案?
答案 0 :(得分:0)
这是一个我可能会为你的情况工作的想法。在您的路线中,您可以创建如下路线:get '/user/:id_or_handle', controller: 'users', action: 'action', as: 'user_page'
as:创建路径user_page_path
,您可以在其中传入用户对象,或current_user
如果您将用户存储到session,像这样user_page_path(user.id or user.username)
然后你可以操纵:id_or_handle
答案 1 :(得分:0)
只需使用friendly_id
,这正是您所需要的。
#Gemfile
gem 'friendly_id', '~> 5.1'
$ rails generate friendly_id
$ rails generate scaffold user name:string slug:string:uniq
$ rake db:migrate
#app/models/user.rb
class User < ActiveRecord::Base
extend FriendlyId
friendly_id :handle, use: [:finders, :slugged]
end
$ rails c
$ User.find_each(&:save)
这将替换:id
和模型查找中对routes
的所有引用,以便您可以使用:
<%= link_to @user.handle, @user %>
...它将显示用户的句柄。