обновление записи пользователя при связывании провайдеров с omniauth

Когда я создаю новую учетную запись через Google, электронная почта сохраняется в моей записи пользователя. Когда я создаю пользователя через твиттер, столбец электронной почты пуст. Я хотел бы обновить эту запись, если пользователь связывает свою текущую учетную запись Twitter с Google.

в моей модели пользователя:

def self.create_from_hash!(hash)
  create! do |user|
    user.name = hash['user_info']['name']
    user.email = hash['user_info']['email']
  end
end

В контроллере сессий:

def create
  auth = request.env['rack.auth']
  unless @auth = Authorization.find_from_hash(auth)
    @auth = Authorization.create_from_hash(auth, current_user)
  end
  self.current_user = @auth.user
  flash[:notice] = "Welcome, #{current_user.name}."
  redirect_to '/'
end

и в модели авторизации:

def self.create_from_hash(hash, user = nil)
  user ||= User.create_from_hash!(hash)
  Authorization.create(:user => user, :uid => hash['uid'], :provider => hash['provider'])
end

Как я могу обновить этот столбец при добавлении метода авторизации?


person aperture    schedule 29.01.2011    source источник


Ответы (1)


Я добавил следующую строку в действие создания контроллера сеансов, которое, похоже, решает проблему:

if @user && (@user.email.blank? || @user.email.nil?)
    @user.update_attribute(:email, request.env['rack.auth']['user_info']['email']) unless request.env['rack.auth']['user_info']['email'].nil? || @user.nil?
end
person aperture    schedule 30.01.2011
comment
Достаточно сделать только @user.email.blank? проверьте, зачем вы делаете @user.email.nil? - person Ivailo Bardarov; 28.05.2011
comment
@Ivailo Bardarov - я точно не помню, было ли явно необходимо проверять нуль, но у меня есть несколько провайдеров и несколько методов, и я полагаю, что были случаи, когда @user.email возвращал ноль - person aperture; 30.05.2011
comment
@Ivailo Bardarov - нет, пустые чеки на пустые, как я уже сказал, я использовал несколько провайдеров и несколько механизмов аутентификации, в некоторых случаях поле электронной почты может быть пустым, в других случаях оно может быть нулевым, поэтому я проверил оба - person aperture; 14.06.2011
comment
Согласно RDOC api.rubyonrails.org/classes/Object. html#method-i-blank-3F Объект является пустым, если он является ложным, пустым или представляет собой строку с пробелами. Например, «», « », nil, [] и {} пусты. Значит, нет необходимости проверять это дважды, один раз с .nil? и сразу с пустым?. - person Ivailo Bardarov; 15.06.2011