Если пользователь зарегистрировался на моем веб-сайте с использованием «родной» регистрации электронной почты, а затем, выйдя из системы, хочет использовать свою учетную запись Facebook для входа в систему, я хочу, чтобы это было просто замечательно, и чтобы «объединить»информация в одного пользователя.Вот мой метод для этого:
def self.from_omniauth(auth)
if user = User.find_by(email: auth.info.email)
user.provider ||= auth.provider
user.uid ||= auth.uid
user.first_name ||= auth.info.first_name
user.last_name ||= auth.info.last_name
user.save
user
elsif user = User.create(provider: auth.provider, uid: auth.uid)
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
user.first_name = auth.info.first_name
user.last_name = auth.info.last_name
user.save
user
end
end
Кажется, он работает нормально, хотя мои тесты довольно просты.У меня просто несколько вопросов, я относительно программист-любитель и ценю мудрость тех, у кого есть опыт, чтобы знать не просто «как», а «как лучше».
Является ли этообычная и "легальная" практика? Может быть, есть какая-то проблема конфиденциальности или "лучшей практики", о которой я не думаю?
Есть ли способ объединить find_by
и * 1013?* звонит, две ветви моего if/elsif
заявления? На самом деле, этот пост имеет отличный ответ при использовании tap
. Есть ли причина не делать этого?
Каков обычный способ сделать это с более чем одним провайдером (например, если пользователь, о котором мы говорим, зарегистрировался по электронной почте, затем вошел в Facebook, а затем вошел в Google)?либо хеш, либо целый другой объект ActiveRecord. (можете ли вы даже сохранить хеш как свойство объекта ActiveRecord?)
Надеюсь, можно написать вопрос, который не соответствуетточно проблема. Спасибо за совет!