生成唯一的用户名(omniauth + devise)

hyp*_*jas 4 ruby-on-rails devise omniauth ruby-on-rails-3

我有一个带有devise + omniauth用户身份验证的应用程序.

在我的模型中,我的应用中的用户名是唯一的.我不想在我的应用程序中重复用户名.

Facebook中的某些用户在其个人资料中没有定义的用户名.

如果用户没有在facebook中定义用户名,我想生成一个唯一的用户名.

例如,为了生成密码我有这个:

:password => Devise.friendly_token[0,20]
Run Code Online (Sandbox Code Playgroud)

如果Facebook用户在Facebook中没有用户名,我如何为我的应用生成唯一的用户名?

谢谢

Max*_*ams 11

您可以创建一个很好的可读用户名(例如从电子邮件的第一部分生成),然后通过添加数字确保它是唯一的.例如

#in User
def get_unique_login
  login_part = self.email.split("@").first
  new_login = login_part.dup 
  num = 2
  while(User.find_by_login(new_login).count > 0)
    new_login = "#{login_part}#{num}"
    num += 1
  end
  new_login
end
Run Code Online (Sandbox Code Playgroud)

这里的一个问题是,有人可能会在你获得它并保存它之间进行登录.所以,也许最好把它组合成一个before_create过滤器:

#in User
before_create :ensure_login_uniqueness

def ensure_login_uniqueness 
  if self.login.blank? || User.find_by_login(self.login).count > 0
    login_part = self.email.split("@").first
    new_login = login_part.dup 
    num = 2
    while(User.find_by_login(new_login).count > 0)
      new_login = "#{login_part}#{num}"
      num += 1
    end
    self.login = new_login
  end
end
Run Code Online (Sandbox Code Playgroud)

  • while循环不应该包括num + = 1吗? (5认同)

alo*_*ony 2

您可以在 @ 符号之前获取电子邮件的一部分,然后添加诸如 user_id 之类的内容,或者只获取电子邮件本身。或者您可以以某种方式组合 Facebook 响应中的名字和姓氏。

  • 我总是这样做:`user.username = user.email[/^[^@]*/]`,它看起来不错,但可能会重复。在你的情况下,你可以这样做: `user.username = "#{user.email[/^[^@]*/]}_#{user.id.to_s[0..5]}"` - 采取前 6 个只是为了不要太长:) (2认同)