webentwicklung-frage-antwort-db.com.de

Rails 5, Undefinierte Methode `for 'für # <Devise on line devise_parameter_sanitizer.for

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?

92
Dmitriy

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
166
Зелёный

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

33
Brandy Burdick

Vergiss nicht devise_parameter_sanitizer.permit(:account_update, keys: [:username])

2

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
0
Elias Glyptis