Ich habe versucht, dies zu erforschen, aber seltsamerweise scheint niemand dieses Problem zu haben, oder ich suche nicht richtig. Wie auch immer, hier ist mein user.rb. Ich kann einen Benutzer kein Problem erstellen und mein benutzerdefiniertes Feld, 'pin, wird gesetzt. Ich kann das 'Pin'-Feld aktualisieren. Wenn Sie jedoch versuchen, den Namen, die E-Mail-Adresse oder das Passwort zu ändern, schlagen sie fehl, da die PIN in der Validierung meines Modells leer ist. Wie überspringe ich die Pin-Validierung, wenn ich sie nicht aktualisiere? Wenn ich meine E-Mail aktualisiere, sendet sie immer noch eine Bestätigung, aber wenn ich auf den Link klicke, wird der Pin erneut bestätigt und die Bestätigung schlägt fehl. Außerdem möchte ich den Hash im Helfer nach_validation nicht neu generieren.Überspringen Validierung für benutzerdefinierte Felder hinzugefügt zu Devise-Benutzermodell
class User < ApplicationRecord
has_many :profiles, dependent: :destroy
has_many :general_settings, dependent: :destroy
has_many :profile_settings, through: :profiles
has_many :tags, dependent: :destroy
has_many :videos, through: :profiles
belongs_to :account_type
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable
after_validation :create_parent_digest
validates :pin, presence: true, length:{ is: 4 }, confirmation: true
attr_accessor :pin, :pin_confirmation
def valid_pin?(pin)
Devise::Encryptor.compare(self.class, parent_digest, pin)
end
private
def create_parent_digest
self.parent_digest = Devise::Encryptor.digest(self.class, pin)
end
end
Vielen Dank für Ihre Antwort. Das wird funktionieren, außer es wird den Pin nicht validieren, wenn ich es ändere. Irgendwie muss ich Devise sagen, die Validierung zu umgehen, wenn die Bestätigungsfelder für Pin und Pin auf der Bearbeitungsseite leer sind. Ich bemerke, dass Sie benutzerdefinierte Kontexte erstellen können, aber sie müssen an gültige übergeben werden? und nicht_valid? ausdrücklich. –
Was den Callback betrifft, wie verhindere ich in diesem Fall, dass ein blanker Pin gespeichert wird, da der Devise-Controller den Datensatz speichert, bevor der Pin gehackt wird? –
Ich denke, ich muss vielleicht eine benutzerdefinierte Validierungsmethode erstellen, die all die Dinge tut, die rails für mich tun und die Validierung beenden, wenn die Pin/Pin-Bestätigung leer ist und es einen Pin-Digest gibt, dann fügen Sie keine Fehler hinzu. –