我遇到了tutorial编写Facebook身份验证系统的问题。
首先,我遇到错误ActiveModel :: ForbiddenAttributesError。我用coderhs answer更正了它。
现在,当我使用Facebook登录时,它可以正常运行,但是当我使用其他帐户登录时,它会覆盖我桌面中的上一个用户,因此我无法同时连接多个Facebook用户,仍然保留用户的相关信息。
User.rb
def self.from_omniauth(auth)
where(auth.slice(provider: auth.provider, uid: auth.uid)).first_or_create.tap do |user|
user.provider ||= auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save!
end
修改 我注意到first_or_create编辑了最后插入的查询并且没有创建条目,我添加了它:
User.rb
def self.from_omniauth(auth)
where(auth.slice(uid: auth.uid)).first_or_create.tap do |user|
if user.uid == auth.uid
puts "\nUserModel:_________" + auth.provider + " - " + auth.uid + "\n"
else
puts "\nUnknown user " + auth.uid
end
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.email = auth.info.email
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save
end
end
当我使用第二个帐户登录时,else puts会显示在控制台中,但会进行编辑而不会在表格中创建新行
Edit2 [解决方案]
User.rb
def self.from_omniauth(auth)
User.find_or_create_by(uid: auth.uid).tap do |user|
if user.uid == auth.uid
puts "\nUserModel:_________" + auth.provider + " - " + auth.uid + "\n"
else
puts "\nUnknown user " + auth.uid
end
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.email = auth.info.email
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save
end
end
[第二个问题由Oleksandr Avoyants解决]我也想知道如何从Facebook用户那里获取电子邮件。我试着添加
user.email = auth.email
......但实在太容易了。
答案 0 :(得分:0)