2010-08-22 3 views
19

Mein Benutzermodell enthält: Name,: E-Mail und: Passwortfelder. Alle 3 haben eine Gültigkeitsprüfung für die Länge. Eine "update account" -Webseite ermöglicht dem Benutzer, seinen Namen und seine E-Mail-Adresse zu aktualisieren, aber nicht Passwort. Das übermittelte params [: user]Wie kann ich in Rails 3 die Validierung des Passwortfelds überspringen, wenn ich nicht versuche, das Passwort zu aktualisieren?

{"name"=>"Joe User", "email"=>"[email protected]"} 

Hinweis gibt es keine „Passwort“ Schlüssel ist, weil die Form nicht so ein Eingabefeld enthält.

Als ich

@user.update_attributes(params[:user]) 

die Kennwortüberprüfung aufrufen fehlschlägt. Da ich jedoch nicht versuche, das Kennwort zu aktualisieren, möchte ich nicht, dass die Kennwortüberprüfung mit diesem Update ausgeführt wird. Ich bin verwirrt, warum die Passwort-Validierung läuft, wenn params [: user] keinen "password" Schlüssel enthält.

Beachten Sie, dass ich eine separate Webseite an anderer Stelle haben möchte, die es dem Benutzer ermöglicht, sein Kennwort zu aktualisieren. Und für diese Einreichung sollte die Passwort-Validierung laufen.

Vielen Dank.

+1

Es sollte nicht die Passwort-Validierung laufen und es fehlschlagen, wenn das Passwort-Feld zuerst gültig ist. Du sagst, du gibst das Passwort nicht ein, aber ich habe meinen Verdacht, dass du es warst. –

Antwort

27

Meine Anwendung tut so etwas wie dieses

attr_accessor :updating_password 

validates_confirmation_of :password, :if => should_validate_password? 

def should_validate_password? 
    updating_password || new_record? 
end 

, so dass Sie model.updating_password = true für die Überprüfung stattfinden müssen, und Sie haben nicht diese über die Schöpfung zu tun.

Was ich zu einem guten Railscast bei http://railscasts.com/episodes/41-conditional-validations

+0

Danke, mathematisch. Das hat für mich funktioniert. – Sanjay

+0

Vielleicht verwenden Sie stattdessen den 'password_changed?' Helfer? –

+0

@PeterEhrlich, die eine fehlende Methode auslösen, wenn Sie 'has_secure_password' verwenden. Sie müssten das auf "password_digest" aufrufen, da das Kennwort aktualisiert wird, wenn das Kennwort vorhanden ist. – Mohamad

0

Eine App, die ich arbeite verwendet der folgende:

validates_confirmation_of :password, 
           :if => Proc.new { |account| 
               !account.password.blank? 
               || !account.password_confirmation.blank? 
               || account.new_record? } 

Je nach Bedarf könnten Sie die new_record entfernen? check

+0

Das scheint, als ob die Bestätigungsstelle entfernt wird - Sie werden nicht bestätigen, wenn sie die Bestätigung im Formular nicht angegeben haben. – alternative

+0

Hmm ... sieht aus wie ein Käfer, du hast Recht. –

1

In Ihrem Benutzermodell könnten Sie einfach die Kennwortüberprüfung ignorieren, wenn sie nicht festgelegt ist.

validates_length_of :password, :minimum => N, :unless => lambda {|u| u.password.nil? } 
+3

Würde dies jemandem erlauben, ein leeres Passwort zu setzen? – Pete

1

Mit update_attributes nicht den Wert des Passworts ändern gefunden, wenn es keinen Schlüssel für die es in den params-Hash ist.

Die Validierung wird nicht nur für die geänderten Felder ausgeführt. Es validiert auch bestehende Werte.

Ihre Validierung muss fehlschlagen, da das Kennwortfeld einen ungültigen Inhalt enthält, der bereits in der Datenbank gespeichert ist. Ich nehme an, es ist wahrscheinlich, weil Sie es nach der Validierung hashing und Sie versuchen, die Hash-Zeichenfolge zu validieren.

Sie können ein virtuelles Attribut (eine Instanzvariable oder -methode) verwenden, das Sie mit einer benutzerdefinierten Methode validieren, und dann den Hash dem gespeicherten Kennwortfeld zuweisen. Werfen Sie einen Blick auf this technique für Ideen.

0
When password is added then only confirmation will be called and presence will call on create action only 

    **validates_presence_of :password, :on =>:create** 

    **validates_confirmation_of :password**