2010-11-04 16 views
12

Ich habe omniauth mit meinem Gerätemodell implementiert, damit ich mit anderen Diensten authentifizieren kann. Passwort ist nicht mehr notwendig für mein Modell, wie Benutzer mit twitter, facebook ...Rails 3 - Devise: Wie überspringe das 'current_password' beim Editieren einer Registrierung?

0-Alles funktioniert gut, aber, wenn ein Benutzer versuchen, seine Registrierung zu bearbeiten, überspringe den Prozess überspringen, weil der Benutzer nicht Informiere das 'current_password' (welches momentan nicht existiert).

Ich habe einen Registrierungscontroller die Vermächtnisse zu überschreiben:

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

Aber ich habe nicht finde alle Unterlagen darüber, wie überspringen Sie die Passwortüberprüfung, wie könnte ich es in meiner Update-Aktion?

Antwort

34

Ähnlich wie oben, versuchen Sie dieses Modell in Ihrem Benutzer setzen:

# 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

wirklich nett. funktioniert perfekt! – Tronic

+0

Es funktioniert! Danke ich liebe dich! – rodrigoalves

+4

Es kann sich lohnen, einen Aufruf an 'clean_up_passwords' anzuhängen. Nach dem Speichern werden die Attribute "password" und "password_confirmation" auf null gesetzt, um das Kennwort des Benutzers geheim zu halten. Siehe Devices [update_with_password-Implementierung] (https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L56) als Referenz. –

10

Das funktioniert für mich folgende:

In meinen Benutzer-Controller in der Update-Aktion habe ich

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

Sie vielleicht, dass an einen before_save Rückruf anpassen könnten?

1

Auch die Antwort war hier für eine Weile will ich ein neues schreiben, wie ich die gewählte Antwort denken, ein wenig Fehler hat . Vielleicht hatte es zur Zeit nicht hat die Antwort erstellt wurde, aber jetzt in 2013, wäre die Antwort so aussehen:

# 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

Aber was wäre in der RegistrationsController # Update-Methode? –

+0

Nichts. Der Registrierungs-Controller sollte überhaupt nicht erstellt werden. Die Lösung wäre, NUR im Benutzermodell zu erstellen, wie ich meine Antwort eingegeben habe, und keine zusätzlichen Klassen zu erstellen, wie es in der Frage gesagt wird. – Aleks

0

dort:

Die Lösung in User Modell sein würde wie folgt zu erstellen Antwort ist eine einfacher, ich weiß nicht, wann devise erste Methode hatte aber nur um

Model.update_without_password(params)

Zugabe wird es Attribute aktualisieren, ohne aktuelles Passwort zu erfordern.

Verwandte Themen