[英]Devise skip confirmation when using omniauth
How can I change the following code so that a user that signs in with facebook gets to skip the confirmation with devise confirmable?如何更改以下代码,以便使用 facebook 登录的用户可以跳过与设计可确认的确认? I tried adding
user.skip_confirmation!
我尝试添加
user.skip_confirmation!
under the line user.email...
but this did not work.在
user.email...
行user.email...
但这不起作用。
user.rb:用户.rb:
# Finds or creates user based on omniauth hash from given provider
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.provider = auth.provider
user.uid = auth.uid
user.first_name = auth.info.first_name
user.last_name = auth.info.last_name
user.email = auth.info.email
end
end
# Overrides class method 'new_with_session' to persist and validate attributes
def self.new_with_session(params, session)
if session["devise.user_attributes"]
new(session["devise.user_attributes"], without_protection: true) do |user|
user.attributes = params
user.valid?
end
else
super
end
end
omniauth_callbacks_controller.rb omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def all
user = User.from_omniauth(request.env["omniauth.auth"])
if user.persisted?
flash.notice = "Signed in!"
sign_in_and_redirect user
else
session["devise.user_attributes"] = user.attributes
redirect_to new_user_registration_url
end
end
alias_method :facebook, :all
end
Try this with first_or_initialize
:用
first_or_initialize
试试这个:
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid). first_or_initialize do |user|
user.provider = auth.provider
user.uid = auth.uid
user.first_name = auth.info.first_name
user.last_name = auth.info.last_name
user.email = auth.info.email
user.skip_confirmation!
user.save!
end
end
If you're looking for the simplest way, just adding user.skip_confirmation!
如果您正在寻找最简单的方法,只需添加
user.skip_confirmation!
in the method referred in the documentation does work now:在文档中提到的方法现在确实有效:
# app/model/user.rb
def self.from_omniauth(access_token)
data = access_token.info
user = User.where(email: data['email']).first
# Users are created if they don't exist
unless user
user = User.create(username: data['name'],
email: data['email'],
password: Devise.friendly_token[0, 20])
user.skip_confirmation! # Add this line to skip confirmation
end
user
end
If you want to skip both confirmation and the email confirmation notification (which would make sense), you'll just need to add user.skip_confirmation!
如果您想跳过确认和电子邮件确认通知(这很有意义),您只需要添加
user.skip_confirmation!
before saving the user, which you can do like this:在保存用户之前,您可以这样做:
# app/model/user.rb
def self.from_omniauth(access_token)
data = access_token.info
user = User.where(email: data['email']).first
# Users are created if they don't exist
unless user
user = User.new(username: data['name'],
email: data['email'],
password: Devise.friendly_token[0, 20])
user.skip_confirmation! # Add this line to skip confirmation
user.save
end
user
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.