生成唯一的用户名(omniauth + devise)
我有一个带有devise + omniauth用户身份validation的应用程序。
在我的模型中,我的应用中的用户名是唯一的 。 我不想在我的应用程序中重复用户名。
Facebook中的某些用户在其个人资料中没有定义的用户名。
如果用户没有在facebook中定义的用户名,我想生成一个唯一的用户名。
例如,为了生成密码我有这个:
:password => Devise.friendly_token[0,20]
如果Facebook用户在Facebook中没有用户名,我怎样才能为我的应用生成唯一的用户名?
谢谢
您可以在@符号之前接收电子邮件的一部分,并添加像user_id那样的smth,或者只是接收电子邮件本身。 或者你可以以某种方式结合fb响应中的名字和姓氏。
您可以创建一个很好的可读用户名(例如从电子邮件的第一部分生成),然后通过添加数字确保它是唯一的。 例如
#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
这里的一个问题是,有人可能会在你获得它并保存它之间进行登录。 所以,也许最好把它组合成一个before_createfilter:
#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
以下是我使用名字和姓氏字段组合创建登录的方法。欢迎使用此代码的改进。
before_create :ensure_login_uniqueness def ensure_login_uniqueness if self.login.blank? self.name = self.first_name + " " + self.last_name firstnamePart = self.first_name.downcase.strip.gsub(' ', '').gsub(/[^\w-]/, '') lastnamePart = self.last_name.downcase.strip.gsub(' ', '').gsub(/[^\w-]/, '') login_part = firstnamePart+lastnamePart new_login = login_part.dup num = 1 while(User.where(:login => new_login).count > 0) new_login = "#{login_part}#{num}" num += 1 end self.login = new_login end end
它不适合我,但改变:
while(User.find_by_login(new_login).count > 0)
至
while(User.where(login: new_login).count > 0)
这是我用于Facebook的方法
def ensure_username_uniqueness self.username ||= self.email.split("@").first num = 2 until(User.find_by(username: self.username).nil?) self.username = "#{username_part}#{num}" num += 1 end end def self.from_omniauth(auth) where(provider: auth.provider, uid: auth.uid).first_or_create do |user| user.email = auth.info.email user.password = Devise.friendly_token[0,20] user.username = auth.info.name.downcase.gsub(" ", "") user.username = user.username[0..29] if user.username.length > 30 user.ensure_username_uniqueness end end
- Rails:在Omniauth使用Devise登录后从Facebook检索图像
- Rails 3使用omniauth获取gmail联系人?
- 使用Devise和Omniauth的路由问题
- puma生产服务器在后台:omniauth记录到stdout失败导致错误
- SSL_connect SYSCALL返回= 5 errno = 0 state = SSLv2 / v3读取服务器hello A – Faraday :: Error :: ConnectionFailed
- 未初始化的常量User :: Authorization | omniauth
- OmniAuth Railscast中的DangerousAttributeError教程:create由ActiveRecord定义
- 为什么我在前2位用户之后收到“此授权码已被使用”?
- 如何覆盖gem依赖?