создать уникальное имя пользователя (omniauth + devise) - PullRequest
4 голосов
/ 28 марта 2012

У меня есть приложение с аутентификацией пользователя с помощью devise + omniauth.

В моей модели это имя пользователя в моем приложении уникально . Я не хочу дублировать имя пользователя в моем приложении.

Некоторые пользователи в фейсбуке не имеют определенного имени пользователя в своем профиле.

Я хочу создать уникальное имя пользователя, если у пользователя нет имени пользователя, определенного в facebook.

Например, для генерации пароля у меня есть это:

:password => Devise.friendly_token[0,20]

Как создать уникальное имя пользователя для моего приложения, если у пользователя Facebook нет имени пользователя в Facebook?

Спасибо

Ответы [ 5 ]

11 голосов
/ 28 марта 2012

Вы можете создать красивое читаемое имя пользователя (например, сгенерированное из первой части письма), а затем убедиться, что оно уникально, добавляя числа до тех пор, пока оно не станет.Например,

#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_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
2 голосов
/ 16 сентября 2014

Вот как я создал Логин с комбинацией поля имени и фамилии. Улучшения в этом коде приветствуются.

 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
2 голосов
/ 28 марта 2012

Вы можете взять часть письма до знака @ и добавить туда что-то вроде user_id, или просто взять само письмо. Или вы можете как-то объединить имя и фамилию из ответа fb.

1 голос
/ 16 мая 2016

Вот мои методы, которые я использую для 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
1 голос
/ 14 февраля 2014

У меня это не сработало, но изменилось:

while(User.find_by_login(new_login).count > 0)

до

while(User.where(login: new_login).count > 0)
...