Ich arbeite mit Rails 5
Ich habe ein neues Feld Benutzername im Modell Benutzer hinzugefügt.
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_permitted_parameters
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up).Push(:username)
end
end
Während der Registrierung wird der Fehler angezeigt: ndefinierte Methode `for 'für # Meinten Sie? Fork
Spur:
NoMethodError (undefinierte Methode `for 'für # Meinten Sie? Fork):
app/controllers/users/registrations_controller.rb:7:in `configure_permitted_parameters'
Rendering /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
Rendering /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
Rendered /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (5.0ms)
Rendering /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
Rendered /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.9ms)
Rendering /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
Rendered /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.2ms)
Rendered /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (118.1ms)
Wer kann helfen? Wie lösen Sie dieses Problem?
According to the documentation:
Die Parameter Sanitaizer-API wurde für Devise 4 geändert
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
end
end
Wenn Sie nur das .for
bis .permit
es funktioniert auch. Beispielsweise:
devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :username) }
Es funktioniert sowohl in Rails 4.2.x als auch Rails 5.0.x
Vergiss nicht devise_parameter_sanitizer.permit(:account_update, keys: [:username])
Ich denke, Sie haben das account_update in der configure_permitted_parameters-Methode Ihres Controllers verpasst. Sie müssen dem Entwurfsmuster folgen. Der Entwurf hat eine Seite zur Kontoaktualisierung. Sie finden diese unter views/devise/registrations/edit.html.erb und unter Code funktioniert auch nicht auf der Anmeldeseite, hier haben Sie die Anmeldeseite angegeben
Um Ihre Benutzertabelle zu aktualisieren, müssen Sie in dem Moment, in dem Sie ein Update für Ihre Benutzer/Bearbeiter einreichen oder wenn Sie auf der Anmeldeseite einen Benutzernamen eingeben, diesem Entwurfsmuster folgen, um die Benutzertabelle der Datenbank zu aktualisieren. Auch wenn Sie der Benutzertabelle eine neue Spalte hinzugefügt haben, müssten Sie diese der configure_permitted_parameters-Methode hinzufügen. In deinem Fall ist es der Benutzername, aber du hast auch account_update verpasst. Sie sagen im Grunde, dass Sie den Benutzernamen aktualisieren oder die Zeichenfolge zum Feld "Benutzername" hinzufügen möchten, ohne dem Devise-Muster zu folgen. Jedes Feld, das Sie der Benutzertabelle hinzufügen, sollte diesem Entwurfsmuster folgen. Sie können auch angeben, auf welcher Seite dieser Benutzername aktualisiert werden darf. In meinem Beispiel unten verwende ich die Aktualisierungsseite für Geräte. Wie ich bereits sagte, müssen Sie diesem Muster folgen, auch wenn Sie der Benutzertabelle einen benutzerdefinierten Feldnamen hinzugefügt haben. Wenn Sie eine andere Seite haben, auf der Sie einen Benutzernamen hinzufügen müssen, tun Sie dasselbe.
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
devise_parameter_sanitizer.permit(:account_update, keys: [:username])
end
end
Vergewissern Sie sich als Nächstes in Ihrer user.rb, dass Sie einen gültigen Benutzernamen in Ihrem Benutzermodell haben.
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates :username, presence: true
end