Update `User` Attribute ohne Passwort
Gerade jetzt, Benutzer können auch Bearbeiten, Ihre Attribute, die zimmerreserviereung, ohne das Sie Ihr Kennwort eingeben, weil meine Validierungen sind wie folgt eingerichtet:
validates :password, :presence =>true, :confirmation => true, :length => { :within => 6..40 }, :on => :create
validates :password, :confirmation => true, :length => { :within => 6..40 }, :on => :update, :unless => lambda{ |user| user.password.blank? }
Jedoch, nachdem ein Benutzer tut dies, Ihr Passwort ist gelöscht - update_attributes zu aktualisieren ist, Ihr Passwort zu "". Hier ist mein update definition:
def update
if @user.update_attributes(params[:user])
flash[:success] = "Edit Successful."
redirect_to @user
else
@title = "Edit user"
render 'edit'
end
end
Habe ich auch versucht, mit einer anderen definition, die verwendet update_attribute statt:
def save_ff
@user = User.find(params[:id])
@user.update_attribute(:course1, params[:user][:course1] )
@user.update_attribute(:course2, params[:user][:course2] )
@user.update_attribute(:course3, params[:user][:course3] )
@user.update_attribute(:course4, params[:user][:course4] )
redirect_to @user
end
Aber aus irgendeinem Grund ist dies die gleiche Sache zu tun. Wie kann ich ein update für einige Benutzer-Attribute, die ohne das Kennwort zu ändern? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wusste ich nicht, dass die Lösung, die ich dir gestern gab, würde zu diesem problem führen. Sorry.
Gut, inspiriert von auszudenken, sollten Sie Sie einfach aktualisieren Sie Ihre controller auf diese Weise:
In diesem blog-post zeigt die wichtigsten von dem, was Sie tun möchten.
Dem, was nicht gezeigt, aber hilfreich sein können, ist das hinzufügen von Accessoren für das Modell:
und bieten alle gewünschten Validierung unter der Bedingung, dass der user ein neues Passwort.
Schließlich würde ich noch hinzufügen überprüfen, um zu sehen, ob die encrypted_password gesetzt wurde, um zu bestimmen, ob "password_changed?", um ein Kennwort erforderlich, auf einen neuen Datensatz.
Ich habe gekämpft, mit diesem und im Kreise herum für eine Weile, so dass ich dachte, ich würde meine Schienen 4 Lösung hier.
Keiner der Antworten, die ich bisher gesehen habe, erfüllen meine, Sie alle scheinen zu beinhalten, umgehen der Validierung in gewisser Weise, aber ich möchte in der Lage sein zu überprüfen, die in anderen Bereichen und auch das Passwort (falls vorhanden). Auch ich bin nicht mit entwickeln auf mein Projekt, also kann ich nicht nutzen, nichts bestimmtes zu.
Darauf hingewiesen werden, dass es einen 2 Teil problem:
Schritt 1 - Sie brauchen, um das Kennwort zu entfernen und Bestätigung-Feld von der starke Parameter, wenn das Kennwort leer ist, wie dies in Ihrem controller:
Schritt 2 - Sie müssen die alter-Validierung, so dass das Passwort gar nicht überprüft, wenn es nicht eingegeben wird. Was wir nicht wollen, ist für Sie festgelegt werden, zu leeren, damit, warum wir es entfernt von unserer Parameter früher.
In meinem Fall bedeutet dies, dass diese wie die Validierung in meinem Modell:
Beachten :wenn => :Kennwort überspringen zu prüfen, ob das Kennwort ist nicht gesetzt.
validates :password, :presence => true, :confirmation => true, length: {minimum: 7}, on: :create
so die Validierung erfolgt nur für die create-MethodeIch hatte das gleiche problem und die oben genannten Lösungen nicht funktioniert hat für mich. Ich fand die wahre Schuldige in meinem Fall: ich hatte eine encrypt_password Rückruf in meinem Benutzer-Modell, das die Einstellung war, das Passwort auf blank jedes mal.
before_save :encrypt_password
Ich es behoben, indem ein Zustand am Ende für diesen Anruf zurück:
before_save :encrypt_password, :wenn nicht => Proc.new { |u| u.Passwort.leer? }
2017 Antwort:
In Schienen 5 als auch durch Michael Hartl tutorial, es ist genug, dass Sie etwas entlang diesen Linien in Ihrem Modell:
allow_nil: true ist hier der Schlüssel, der dem Benutzer erlaubt die Bearbeitung seiner/Ihrer info, ohne auch erfordert, ein Kennwort zu ändern.
An dieser Stelle könnte man denken, dass sich dies auch erlauben, leeren Benutzer-Anmeldungen; diese ist Jedoch verhindert, indem die
has_secure_password
die automatisch überprüft, Passwort-Präsenz, sondern nur diecreate
Methode.Dies ist eine demo-User-Modell zur illustration:
Ich habe keine Ahnung, wie dies zu tun mit entwickeln. Meine zwei Cent.
Die richtige Antwort nicht mehr funktioniert, für schiene 4. Ich glaube meine Antwort ist die sauberste und die vielseitigsten, die Arbeit wird, Wann immer Sie wollen zu verlassen, alle Attribute (nicht nur das Passwort). Dieser Ansatz wird benötigt, wenn Sie aktualisieren möchten, die verschiedene Attribute von jedem Modell in einer Reihe von verschiedenen stellen.
Zum Beispiel, wenn Sie wollen, zu tun, was Stack Overflow hat und die Passwörter aktualisierbar über eine
security
Seite, die Profil-Bild, updatefähig über das user-Ansicht anzeigen und den Großteil der Benutzer aktualisierbare Informationen über einen user-Bearbeiten-Ansicht.1) Erweitern Sie die
hash class
mit einer Klasse-Methode zum löschen von leeren Werten. Wir werden mit dieser Methode entfernen Sie leere Werte werden nicht aktualisiert, aber sind noch in der params-hash:1a) Erstellen Sie eine
hash.rb
- Datei in Ihremlib
Verzeichnis, unter einemext
Verzeichnis:Befehlszeile
1b) Innen
hash.rb
, 'erstellen' eineHash
Klasse und erstellen Sie eine.delete_blanks!
Methode:lib/extern/hash.rb
1c) Benötigen diese Datei (und Ihre gesamten lib-Verzeichnis) in die Schienen, die darauf verweisen, in einem Initialisierer:
config/boot.rb
2) Innerhalb des Benutzer#update-Aktion, die Umsetzung unserer glänzenden neuen delete_blanks! Klasse Methode zum entfernen der Attribute wir sind nicht die Updates von den params-hash. Aktualisieren Sie dann die Benutzer-Instanz über die
update_attributes
- Methode, *nicht dieupdate
Methode!2a) Erstens, wir verwenden die delete_blanks! Methode zum Update unserer user_params hash:
app/controllers/users_controller.rb
2b) Und lassen Sie uns jetzt aktualisieren Sie die Instanz, mit der
update_attributes
Methode, (wieder, nicht dieupdate
- Methode):app/controllers/users_controller.rb
Hier ist, wie die fertige
users#update
Aktion Aussehen soll:app/controllers/users_controller.rb
3) In der
User
Modell, fügen Sie dieif: :<attribute>
option, um alle Ihre Validierungen. Dies ist, um sicherzustellen, dass die Validierung wird nur ausgelöst, wenn das Attribut vorhanden ist, in die params-hash. Unseredelete_blanks!
Methode entfernt das Attribut aus dem params-hash, so dass die überprüfung für das Passwort, zum Beispiel, werden nicht ausgeführt. Es ist auch erwähnenswert, dassdelete_blanks!
nur entfernt hash-Einträge mit einem Wert von null, nicht jene, die mit leeren Saiten. Also, wenn jemand verlässt Sie das Passwort auf dem Benutzer-Formular erstellen (oder eine andere form mit einem Feld für das Passwort), eine Präsenz-Validierung wird wirksam, weil der : - Passwort-Eingabe der hash nicht null, es wird ein leerer string sein:3a) Verwendung der
if:
option auf alle Validierungen:app/models/user.rb
... Und das ist es. Nun kann der Benutzer das Modell aktualisiert werden kann, über viele, viele verschiedene Formen, alle über Ihre app. Präsenz Validierungen für ein Attribut noch ins Spiel kommen, auf einer form, die ein Feld enthält, für den es, z.B. das Passwort Anwesenheit Validierung noch kommen würde in spielen in der
user#create
anzeigen.Mag dies Ausführlicher als die anderen Antworten, aber ich glaube, das ist die stabilste Art und Weise. Sie können das update in der isolation einer unendlichen Anzahl von Parametern für
User
- Instanzen, auf eine unendliche Menge der verschiedenen Modelle. Nur denken Sie daran, wenn Sie dies tun wollen mit einem neuen Modell müssen Sie wiederholen Sie die Schritte 2a), 2b) und 3a)user_params
imupdate_attributes(user_params)
ist nicht eine variable, die den hash, sondern einen Aufruf deruser_params
Methode, das gibt einen frischen, unveränderten hash. Ich Mach meine Antwort 🙂obigen code aktualisieren können, Benutzernamen und E-Mail-Feld.
da update_attribute aktualisieren dirty Felder.
aber es ist schade, update_attribute würde überspringen der Validierung.
Ich hatte das gleiche problem. Ich war nicht in der Lage, es zu beheben mit
Habe ich nur in der Lage gewesen, um es zu arbeiten by doing "update_attribute" auf jedes Element einzeln, z.B.
ist eindeutig eine Gesamt-hack, aber das ist die einzige Art, wie ich es herausfinden, ohne messing mit den Validierungen und Sie das Kennwort löschen!