2010-11-04 34 views
12

Ho implementato omniauth con il mio modello di dispositivo, così posso autenticarmi usando altri servizi. La password non è più necessaria per il mio modello, poiché gli utenti possono autenticarsi tramite twitter, facebook ...Rails 3 - Devise: Come saltare la 'current_password' quando si modifica una registrazione?

Tutto funziona correttamente, ma, quando un utente tenta di modificare la sua registrazione, escogitare saltare il processo perché l'utente non ha informa la 'password corrente' (che in alcuni casi non esiste).

ho creato un controller di registrazione per sovrascrivere le escogita uno:

class RegistrationsController < Devise::RegistrationsController 
    def update 
    super 
    end 
end 

Ma non ho trovare alcuna documentazione su come ignorare la verifica della password, come potrei farlo nel mio azione di aggiornamento?

risposta

34

Simile alla precedente, prova a mettere questo nel vostro modello utente:

# bypasses Devise's requirement to re-enter current password to edit 
def update_with_password(params={}) 
    if params[:password].blank? 
    params.delete(:password) 
    params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 
end 
+0

davvero bello. funziona perfettamente! – Tronic

+0

Funziona! Grazie Ti amo! – rodrigoalves

+4

Potrebbe essere utile aggiungere una chiamata a "clean_up_passwords". Dopo il salvataggio, imposta gli attributi 'password' e' password_confirmation' su zero per mantenere segreta la password dell'utente. Vedere l'implementazione [update_with_password] di Devise (https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L56) come riferimento. –

10

Di seguito ha lavorato per me:

Nel mio controller gli utenti, in azione di aggiornamento, ho

params[:user].delete(:password) if params[:user][:password].blank? 
params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 

Forse si potrebbe adattarsi che ad un before_save richiamata?

1

Anche la risposta è stata qui per un po 'voglio postare una nuova, come credo che la risposta selezionata ha un piccoli difetti . Forse non ha avuto al momento la risposta è stato creato, ma ora in 2013, la risposta sarebbe come questo:

La soluzione sarebbe quella di creare in User modello come questo:

# bypass re-entering current password for edit 
    def update_with_password(params={}) 
    current_password = params.delete(:current_password) 

    if params[:password].blank? 
     params.delete(:password) 
     params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 

    clean_up_passwords 
    end 
+0

Ma quale sarebbe nel metodo di aggiornamento # RegistrationsController? –

+0

Niente. Il controller di registrazione non dovrebbe essere creato affatto. La soluzione sarebbe quella di creare SOLO nel modello Utente come ho inserito la mia risposta e non creare alcuna classe aggiuntiva come si dice nella domanda. – Aleks

0

lì è una risposta facile, non so quando concepire doveva prima questo metodo, ma semplicemente aggiungendo

Model.update_without_password(params)

aggiornerà attributi senza richiedere password corrente.

Problemi correlati