我将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回来的信息吗?非常感谢提前!
答案 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