1

错误信息图片

我基本上完全按照以下链接中的说明进行操作,但我遇到了这个该死的错误?我不知道我该怎么做,wtf?我需要创建某种持久化方法吗?还有其他几个类似的问题,在阅读完所有这些问题后,它们根本没有帮助。请帮忙。

https://github.com/zquestz/omniauth-google-oauth2

Omniauths 控制器

class OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def google_oauth2
  # You need to implement the method below in your model (e.g. app/models/user.rb)
  @user = User.from_omniauth(request.env["omniauth.auth"])

  if @user.persisted?
    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google"
    sign_in_and_redirect @user, :event => :authentication
  else
    session["devise.google_data"] = request.env["omniauth.auth"].except(:extra) #Removing extra as it can overflow some session stores
    redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n")
  end
  end
end

用户模型代码片段

def self.from_omniauth(access_token)
data = access_token.info
user = User.where(:email => data["email"]).first
# Uncomment the section below if you want users to be created if they don't exist
# unless user
#     user = User.create(name: data["name"],
#        email: data["email"],
#        password: Devise.friendly_token[0,20]
#     )
# end
  user
end
4

2 回答 2

2

将底部更改为:

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
    user.name = auth.info.name   # assuming the user model has a name
 end
end

运行 rails g 迁移 AddOmniauthToUsers 提供者:字符串 uid:字符串

然后它转到从 Google 帐户成功验证。

所以我相信它现在有效。我想也许问题是我需要将提供程序和 uid 添加到用户数据库模型?

于 2017-05-24T22:46:35.107 回答
0

坚持的?方法是检查用户是否存在,如果不存在这样的记录并且您的用户模型没有创建新记录,则返回 nil 值。因此,通过将示例中的代码取消注释到此:

def self.from_omniauth(access_token)
  data = access_token.info
  user = User.where(:email => data["email"]).first

  # creates a new user if user email does not exist.
  unless user
    user = User.create(name: data["name"],
       email: data["email"],
       password: Devise.friendly_token[0,20]
    )
  end
 user
end

应该解决检查用户是否存在或创建新用户的问题。

于 2019-03-08T05:32:46.740 回答