2011-09-20 11 views
15

Tengo un 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 por correo electrónico para el usuario de la suscripción desde servicios externos como Twitter. Estoy utilizando el dispositivo y no sé cómo omitir la confirmación por correo electrónico para este tipo de usuarios. mi ejemplo de código es el siguienteomitiendo la confirmación de correo electrónico para usuarios de omniauth utilizando el dispositivo

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 regulador del 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 se encuentra por debajo

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á por debajo

<a href="/auth/twitter" class="auth_provider"> 
    <%= image_tag "twitter_64.png", :size => "64x64", :alt => "Twitter" %> 
</a> 

mi ro UTH es así

match 'auth/:provider/callback' => "authentications#create" 

Respuesta

34

Siempre que desea omitir la confirmación para el período Diseñar, sólo tiene que utilizar el siguiente antes de la user.save ...

user.skip_confirmation! 

Así que, básicamente, en la acción del controlador crear, si detecta la lógica omniauth, luego llama eso.

+0

gracias por este consejo. No sé si puede ayudar cada vez que me registre desde el servicio externo, no guarda el correo electrónico y en su lugar aparece un mensaje de error que dice que el correo electrónico no puede estar en blanco. es el mensaje de correo electrónico del servicio externo para ser guardado con el nuevo usuario – Uchenna

+2

Twitter no le proporciona la dirección de correo electrónico de un usuario, por lo que tendrá que pedirles que lo suministren por separado. – Undistraction

+2

Y luego, si manualmente les piden su correo electrónico, debe confirmarlo ... – frandroid

0

Esto podría lograrse estableciendo el atributo confirmed_at, que Idear establece internamente para marcar una cuenta como lo confirma:

user.update(
    confirmed_at: Time.now.utc, 
    confirmation_token: nil 
) 
Cuestiones relacionadas