在omniauth-facebook注册上创建2条记录

时间:2014-06-05 15:29:04

标签: ruby-on-rails facebook devise omniauth

我将omniauth-facebook gem与Devise结合使用,使用户可以使用自己的Facebook帐户登录。这很好用。现在的问题在于,在首次注册Facebook时创建新用户。每个User都有一个ExtendedProfile,其中包含详细的用户信息。因此,电子邮件和密码是users表中的列,但location和profile_image存储在extended_profiles表中。

第一次注册时,会执行以下方法:

def self.find_for_facebook_oauth(auth)
  where(auth.slice(:provider, :uid)).first_or_create do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
  end
end

现在,这会为users表创建一条记录,但不会为extended_profile创建记录。我知道如何使用正确的extended_profiles创建user_id的记录,并填写我从Facebook回来的信息吗?非常感谢提前!

2 个答案:

答案 0 :(得分:1)

所以我在尝试house9的答案时找到了解决方案:

def self.find_for_facebook_oauth(auth)
  where(auth.slice(:provider, :uid)).first_or_create do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
    user.create_extended_profile(
    :first_name => auth.info.first_name,
    :last_name => auth.info.last_name,
    :facebook_avatar => auth.info.image)
  end
end

user.create_extended_profile()行创建了一个填充了auth值的关系记录! :)

答案 1 :(得分:0)

你试过在街区设置吗?不确定这是否有效

def self.find_for_facebook_oauth(auth)
  where(auth.slice(:provider, :uid)).first_or_create do |user|
    user.provider = auth.provider
    # ....
    user.extended_profile.build
  end
end

另一种选择是在after_create上设置User回调来创建记录

http://guides.rubyonrails.org/active_record_callbacks.html#available-callbacks

或者您可以有条件地检查记录是否存在,将该代码更改为:

def self.find_for_facebook_oauth(auth)
  user = where(auth.slice(:provider, :uid)).first

  unless user
    user = User.new
    user.provider = auth.provider
    # ....
    user.extended_profile.build
    user.save
  end

  user
end