2016-01-21 12 views
0

Я использую gem 'omniauth-twitter', чтобы мой пользователь мог войти в мое приложение. Тогда я могу использовать их имя и изображение профиля из twitter в моем приложении.Rails: Twitter Omniauth - обновить атрибуты пользователя (user.image)

Проблема, с которой я столкнулся, заключается в том, что когда пользователь обновляет свое имя или изображение в твиттере, он не обновляется в моем приложении.

Вот мой конфиг:

приложение/контроллеры/omniauth_callbacks_controller.rb

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def all 
    user = User.from_omniauth(request.env["omniauth.auth"]) 

    if user.persisted? 
     flash.notice = "Signed in!" 
     sign_in_and_redirect user  
    else 
     session["devise.user_attributes"] = user.attributes 
     redirect_to new_user_registration_url 
    end 

    end 

    alias_method :twitter, :all 
end 

приложение/модели/user.rb

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.name = auth.info.nickname 
     user.image = auth["info"]["image"].sub("_normal", "") 
    end 
    end 

    def self.new_with_session(params, session) 
    if session["devise.user_attributes"] 
     new(session["devise.user_attributes"]) do |user| 
     user.attributes = params 
     user.valid? 
     end 
    else 
     super 
    end 
    end 

end 

Я не suceed к обновить атрибуты пользователя. Любые идеи, следующие моей конфигурации, чтобы сделать это? Благодарю.

+0

Итак, ваша проблема: а) войти в ваше приложение с твиттером; б) перейти в твиттер и изменить изображение; c) снова войти в приложение; d) ожидать увидеть новое изображение, но увидеть старый? (и то же самое для названия?) –

ответ

1

Я считаю, что вы можете ошибаться в семантике #first_or_create. Правильная семантика:

A) попробуйте найти запись с предоставленной рамкой запроса (ваша где положение ->provider: auth.provider, uid: auth.uid)

В.1) При обнаружении какого-либо, возвратите первый один не выполняет пропущенным в блоке.

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

Таким образом, на первый login, поток программы следует за A> B.2, который создает нового пользователя с правильным именем и изображением. На последовательных входах следует A> B.1, которые просто возвращают пользователя уже в базе данных.

Вы можете решить эту проблему обеспечения код, который задает имя и изображение всегда работает:

def self.from_omniauth(auth) 
    user = find_or_initialize_by(provider: auth.provider, uid: auth.uid) 
    user.name = auth.info.nickname 
    user.image = auth["info"]["image"].sub("_normal", "") 

    user.save 
    user 
end 

Ура!

+0

Самуэль, благодарю вас за ваше четкое объяснение моей проблемы. Ты был прав. Модель проверяла информацию пользователя, как это было, когда пользователь ПОДПИСАЛ. – zacchj