2017-12-28 12 views
0

Ich habe eine Anwendung mit Rails 5.1.4 gestartet; Devise 4.2; Mongoid 6.1.0.undefined Methode will_save_change_to_email?

Wenn ich ein Konto erstellen versuchen, ich diesen Fehler bekam

NoMethodError in Devise :: RegistrationsController # erstellen undefined Methode `will_save_change_to_email?‘ für #

Ich sehe einige Post auf GitHub, aber ich weiß nicht, wie das zu beheben. https://github.com/plataformatec/devise/issues/4531#issuecomment-313600769

Was soll ich tun?

Antwort

1

Wenn Sie E-Mail nicht als Standardfeld für die Anmeldung verwenden möchten, können Sie eine andere angeben. Wir werden :username als Feldname in diesen Beispielen verwenden, aber Sie können jedes Feld verwenden.

Um dies zu implementieren, Kommentar- Sie den folgenden Text in config/initializers/devise.rb Datei und geben Sie das Feld, das Sie bei der Anmeldung verwenden möchten, in wie :username:

config.authentication_keys = [:username] 

Eine andere Möglichkeit ist das Modell zu ändern:

devise :database_authenticatable, :authentication_keys => [:username] 

Dann fügen Sie Validierungen zu Ihrem Modell:

validates :email,uniqueness: true validates :username,uniqueness: true

Erstellen Sie dann eine Migration und Migration:

rails generate migration add_username_to_users username:string:uniq rake db:migrate

Als nächstes stellen Sie sicher, dass Sie das Feld festlegen können, wenn Sie Benutzer erstellen und bearbeiten. Wenn Sie das Feature strong parameters in neueren Rails-Versionen verwenden, können Sie diesen Parameter im Controller mit .permit(:username) lesen. Oder wenn Sie eine ältere Version von Rails verwenden, machen Sie das Feld stattdessen in Ihrem Modell mit attr_accessible :username zugänglich.

Danach können Sie Devise Ansichten mit dem folgenden Befehl erzeugen:

rails generate devise:views 

Und dann werden Sie die Ansichten in app/views/devise/sessions/new.html.erb und app/views/devise/registrations/new.html.erb ändern müssen, um das neue Formularfeld zu verwenden.

Schließlich müssen Sie möglicherweise die Fehlermeldung ändern, die den Benutzern angezeigt wird, wenn sie falsche Anmeldeinformationen angeben oder wenn sie nicht gefunden werden. Sie tun dies in config/locales/devise.en.yml. Achten Sie auf die folgenden:

invalid: 'Invalid email or password.' 
not_found_in_database: 'Invalid email or password.' 

und ändern Sie es so aus:

invalid: 'Invalid username or password.' 
not_found_in_database: 'Invalid username or password.' 

Wenn Sie

invalid: "Invalid %{authentication_keys} or password." 
not_found_in_database: "Invalid %{authentication_keys} or password." 

sehen statt, müssen Sie nichts ändern.

Beachten Sie, dass Benutzer, die keine E-Mail als Authentifizierungsschlüssel verwenden, möglicherweise mehrere Konten mit derselben E-Mail-Adresse haben können. Dies führt dazu, dass das "wiederherstellbare" Modul nicht gut funktioniert, da es nur einen Link in der Passwort-Reset-E-Mail an das erste Konto enthält, für das es eine passende E-Mail findet. Hier finden Sie a thread on the Google Group Informationen zum Implementieren aller Kontoinformationen in die E-Mail zum Zurücksetzen des Kennworts.

Wichtiger Hinweis: Wenn Sie validatable Modul verwenden, definieren email_required? und email_changed?:

# app/models/model.rb 
class Model < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, 
     :trackable, :lockable, :validatable 

    def email_required? 
    false 
    end 

    def email_changed? 
    false 
    end 

    # use this instead of email_changed? for rails >= 5.1 
    def will_save_change_to_email? 
    false 
    end 

end 

Wenn Sie confirmable oder recoverable-Modul verwenden, müssen Sie nur email_changed?-false definieren.