ruby on rails - omitiendo la confirmación de correo electrónico para los usuarios de omniauth que utilizan dispositivos
ruby-on-rails ruby-on-rails-3 (2)
Cuando quiera omitir la confirmación para el período de Diseño, solo use lo siguiente antes de que el usuario.save ...
user.skip_confirmation!
Básicamente, en la acción de crear controlador, si detecta la lógica de omniauth, llame a eso.
Tengo un poco de código aquí donde los usuarios pueden iniciar sesión a través de su cuenta de Twitter. El problema aquí es, ¿cómo puedo omitir la confirmación de correo electrónico para el usuario? Regístrese desde servicios externos como Twitter. Estoy usando un dispositivo y no sé cómo omitir la confirmación de correo electrónico para este tipo de usuarios. mi ejemplo de código es el siguiente
class AuthenticationsController < ApplicationController
# GET /authentications
# GET /authentications.json
def index
@authentications = current_user.authentications if current_user
end
# POST /authentications
# POST /authentications.json
def create
omniauth = request.env["omniauth.auth"]
authentication = Authentication.find_by_provider_and_uid(omniauth[''provider''], omniauth[''uid''])
if authentication
flash[:notice] = "Signed in successfully"
sign_in_and_redirect(:user, authentication.user)
elsif current_user
current_user.authentications.create!(:provider => omniauth[''provider''], :uid => [''uid''])
flash[:notice] = "Authentication successful"
redirect_to authentication_url
else
user = User.new
user.apply_omniauth(omniauth)
if user.save
flash[:notice] = "Signed in successfully"
sign_in_and_redirect(:user, user)
else
session[:omniauth] = omniauth.except(''extra'')
redirect_to new_user_registration_url
end
end
rescue Exception => e
# Just spit out the error message and a backtrace.
render :text => "<html><body><pre>" + e.to_s + "</pre><hr /><pre>" + e.backtrace.join("/n") + "</pre></body></html>"
end
# DELETE /authentications/1
# DELETE /authentications/1.json
def destroy
@authentication = current_user.authentications.find(params[:id])
@authentication.destroy
respond_to do |format|
format.html { redirect_to authentications_url }
format.json { head :ok }
end
end
end
mi controlador de registro es el siguiente
class RegistrationsController < Devise::RegistrationsController
def create
super
session[:omniauth] = nil unless @user.new_record?
end
private
def build_resource(*args)
super
if session[:omniauth]
@user.apply_omniauth(session[:omniauth])
@user.valid?
end
end
end
y mi modelo de usuario esta abajo
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :lockable, :timeoutable and
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :about, :facebook_username, :twitter_username, :icon, :admin
validates_uniqueness_of :username
has_attached_file :icon, :styles => {:thumb => "64x64#"}, :default_url => ''icon_:style.png''
validates_attachment_content_type :icon, :content_type => [''image/jpeg'', ''image/png'', ''image/gif'']
validates_attachment_size :icon, :less_than => 1.megabyte
ajaxful_rater
has_many :authentications
validates_presence_of :username
def apply_omniauth(omniauth)
self.email = omniauth[''user_info''][''email''] if email.blank?
self.name = omniauth[''user_info''][''name''] if name.blank?
self.image = omniauth[''user_info''][''image''] if image.blank?
authentications.build(:provider => omniauth[''provider''], :uid => omniauth[''uid''])
end
def password_required?
(authentications.empty? || !password.blank?) && super
end
end
mi como a la url de autenticación está debajo
<a href="/auth/twitter" class="auth_provider">
<%= image_tag "twitter_64.png", :size => "64x64", :alt => "Twitter" %>
</a>
mi boca es así
match ''auth/:provider/callback'' => "authentications#create"
Esto se podría lograr estableciendo el atributo confirmed_at
, que Devise establece internamente para marcar una cuenta como confirmada:
user.update(
confirmed_at: Time.now.utc,
confirmation_token: nil
)