NoMethodError(nil:NilClass 的未定义方法“信息”)“find_for_google_oauth2”
NoMethodError (undefined method `info' for nil:NilClass) `find_for_google_oauth2'
!我正在尝试让同事和学生使用他们的 google 项目帐户注册。我已经得到传递的令牌,但随后出现错误。
- app/models/user.rb:70:在`find_for_google_oauth2'
app/controllers/authentications_controller.rb:5:在“创建”中
我的身份验证控制器创建方法
def create
auth = request.env[":google_oauth2"]
@user = User.find_for_google_oauth2(request.env["omniauth.auth"])
redirect_to root_url, :notice => "Signed in!"
end
我的用户模型
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.first_name = auth.info.first_name
user.last_name = auth.info.last_name # assuming the user model has a name
user.image = auth.info.image # assuming the user model has an image
end
end
def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
data = access_token.info
user = User.where(:email => data["email"]).first
unless user
user = User.create(name: data["name"],
email: data["email"],
uid: access_token.uid,
provider: access_token.provider,
password: Devise.friendly_token[0,20]
)
end
user
end
和我的 config/omniauth.rd
require 'omniauth-google-oauth2'
OmniAuth.config.logger = Rails.logger
OmniAuth.logger.progname = "omniauth"
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, '***********petnk.apps.googleusercontent.com',
google_client_secret: '***********',
prompt: "consent",
select_account: true,
scope: 'userinfo.email',
image_aspect_ratio: 'square',
image_size: 50
on_failure { |env|AuthenticationsController.action(:failure).call(env) }
end
不确定要包含哪些内容来帮助大家帮助我。我是 rails 的新手,在过去的一年里一直在努力学习,因此非常感谢您的帮助。
谢谢
我不得不将我的创建功能从我的身份验证控制器移动到我的 omnicontroller。不太确定为什么这解决了问题,但现在确实如此。
!我正在尝试让同事和学生使用他们的 google 项目帐户注册。我已经得到传递的令牌,但随后出现错误。
- app/models/user.rb:70:在`find_for_google_oauth2'
app/controllers/authentications_controller.rb:5:在“创建”中
我的身份验证控制器创建方法
def create
auth = request.env[":google_oauth2"]
@user = User.find_for_google_oauth2(request.env["omniauth.auth"])
redirect_to root_url, :notice => "Signed in!"
end
我的用户模型
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.first_name = auth.info.first_name
user.last_name = auth.info.last_name # assuming the user model has a name
user.image = auth.info.image # assuming the user model has an image
end
end
def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
data = access_token.info
user = User.where(:email => data["email"]).first
unless user
user = User.create(name: data["name"],
email: data["email"],
uid: access_token.uid,
provider: access_token.provider,
password: Devise.friendly_token[0,20]
)
end
user
end
和我的 config/omniauth.rd
require 'omniauth-google-oauth2'
OmniAuth.config.logger = Rails.logger
OmniAuth.logger.progname = "omniauth"
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, '***********petnk.apps.googleusercontent.com',
google_client_secret: '***********',
prompt: "consent",
select_account: true,
scope: 'userinfo.email',
image_aspect_ratio: 'square',
image_size: 50
on_failure { |env|AuthenticationsController.action(:failure).call(env) }
end
不确定要包含哪些内容来帮助大家帮助我。我是 rails 的新手,在过去的一年里一直在努力学习,因此非常感谢您的帮助。
谢谢
我不得不将我的创建功能从我的身份验证控制器移动到我的 omnicontroller。不太确定为什么这解决了问题,但现在确实如此。