2013-08-12 3 views
0

Когда пользователь регистрируется с помощью твиттера, я пытаюсь добавить его имя, местоположение и т. Д. В его пользовательскую запись. Я думаю, что хочу сделать что-то вроде user.buildRails - добавление атрибутов пользователю до его создания

Вот контроллер. Это то, что происходит:

user = User.new 
    user.apply_omniauth(omni) 
    if user.save 
     flash[:notice] = "Logged In!" 
     sign_in_and_redirect(:user, user) 
    else 
     session[:omniauth] = omni.except('extra') 
     redirect_to new_user_registration_path 
    end 

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

Любые идеи?

Спасибо!

+1

http://pastebin.com/ZaMEw4B4 – nyzm

+0

Это был не самый подробный ответ, который я когда-либо получал, но через несколько минут я понял, что происходило! Благодаря! Если вы хотите получить кредит за ответ, поставьте что-то более явное как ответ, и я дам вам очки. – Arel

ответ

1

Вы можете создать флаг в apply_omniauth, чтобы принять решение о сохранении или нет.

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

# def apply_omniauth(omniauth) => def apply_omniauth(omniauth, save_it) 
# apply_omniauth with save it flag 
def apply_omniauth(omniauth, save_it = false) 
    case omniauth['provider'] 
    when 'facebook' 
    self.apply_facebook(omniauth) 
    end 
    self.email = omniauth['user_info']['email'] 
    if email.blank ? build_authentications(omniauth, save_it) 
end 

#build authentications 
def build_authentications(omniauth, save_it = false) 
    auth_params = {: provider = > omniauth['provider'], 
     : uid = > omniauth['uid'], 
     : token = > (omniauth['credentials']['token'] rescue nil) 
    } 
    if save_it authentications.create!(auth_params) 
    else authentications.build(auth_params) 
    end 
end 

#force to save 
def apply_omniauth!(omniauth) 
    apply_omniauth(omniauth, true) 
end 
Смежные вопросы