ruby-on-rails ruby-on-rails-3 devise ruby-on-rails-3.1

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 )