2013-02-15 84 views
4

我在我的应用程序中使用Devise Invitable,并且允许用户使用Facebook登录OmniauthFacebook登录设计邀请

我唯一遇到的问题是,当用户选择使用“邀请接受”页面中的链接使用Facebook登录时,它们被重定向到新用户注册页面,并且已经填写了一些详细信息。问题在于,由于Devise Invitable在发送邀请时会创建新用户,因此用户无法使用邀请发送时提供的电子邮件进行登录。

Omniauth Callbacks Controller

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 :facebook, :all 

回答

0

你已确诊的问题,这是你必须像一个User但不是真的。您必须检测是否属于这种情况,并使用您从Facebook收集的数据更新您的记录。

if user.persisted? 
    flash.notice = "Signed in!" 
    sign_in_and_redirect user 
elsif user.previously_invited? 
    invited_user = User.where(email: user.email).first 
    invited_user.attributes = user.attributes 
    invited_user.save 
    sign_in_and_redirect invited_user 
else 
    session["devise.user_attributes"] = user.attributes 
    redirect_to new_user_registration_url 
end 

User#previously_invited?就留给读者做练习,但它会包含在电子邮件where查找与一些色器件,invitable包括在查询中保持字段。

这不太可能是一个完整的解决方案,因为设计可以维护许多字段,可能需要在此操作后调整invited_user。无论您是否认识到邀请已满足,都取决于您。你可能会发现这个理由足以转移到不同于邀请设计的邀请的不同机制。