在Rails中为路由资源实现多个标识符

时间:2016-01-09 06:07:48

标签: ruby-on-rails ruby-on-rails-4

这是场景。假设我的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中执行此操作是否有更优雅的解决方案?

2 个答案:

答案 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 %>

...它将显示用户的句柄。