Rails 5, Undefinierte Methode `for 'für # <Online-Entwicklung devise_parameter_sanitizer.for


95

Ich arbeite mit Rails 5

Ich habe einen neuen Feldbenutzernamen im Modellbenutzer 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 Fehler angezeigt: undefinierte Methode `for 'für # Meinten Sie? Gabel

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 kann man dieses Problem lösen?


1
Es passiert auch auf Rails 4.2.
sekrett

Antworten:


173

According to the documentation:

Die Parameter Sanitaizer-API wurde für Gerät 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

Aus irgendeinem Grund funktioniert dies, aber wenn ich die Schienen neu
starte,

@ K2xL Mülleimer räumen? Ups, es ist Oktober. Wie haben Sie das behoben?
SchneeYetis

Stop + Neustart Frühling, Pehaps
Phillyslick

1
Vielen Dank! Für diejenigen, die ihren Code nicht aktualisieren möchten, können Sie einfach Ihre Gemfile entsprechend anpassen - gem 'devise', '~> 3'sortiert für mich.
Darragh Enright

34

Wenn Sie nur das ändern .for, .permitfunktioniert es 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 in Rails 5.0.x.


2

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


1
Er hat nicht vergessen, er muss auf neue Syntax umsteigen.
sekrett

0

Ich denke, Sie haben account_update in der configure_permitted_parameters-Methode Ihres Controllers verpasst. Sie müssen dem Entwurfsmuster folgen. Devise hat eine Seite zur Kontoaktualisierung. Sie finden dies in views / devise / registrations / edit.html.erb, und Ihr 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 in Ihren Benutzern / Bearbeiten senden oder wenn Sie einen Benutzernamen auf der Anmeldeseite senden, diesem Muster folgen, um die Datenbankbenutzertabelle zu aktualisieren. Selbst wenn Sie der Benutzertabelle eine neue Spalte hinzufügen würden, müssten Sie sie der Methode configure_permitted_parameters hinzufügen. In Ihrem Fall ist es der Benutzername, aber Sie haben 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 Gerätemuster folgen. Sie können auch angeben, auf welcher Seite dieser Benutzername aktualisiert werden darf. In meinem Beispiel unten verwende ich die Seite zum Entwickeln von Updates. Wie ich bereits sagte, müssen Sie diesem Muster folgen, auch wenn Sie der Benutzertabelle einen benutzerdefinierten Feldnamen hinzugefügt haben.

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

Stellen Sie als Nächstes sicher, dass Sie in Ihrer user.rb den Benutzernamen in Ihrem Benutzermodell überprüft haben.

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :username, presence: true
end

-1
class ApplicationController < ActionController::Base

  before_action :configure_permitted_paramters, if: :devise_controller?

  protected
    def configure_permitted_paramters

        devise_parameter_sanitizer.permit(:sign_up, keys: [:fullname])

        devise_parameter_sanitizer.permit(:account_update, keys: [:fullname, 
        :phone_number, :description, :email, :password])

    end

end
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.