web-dev-qa-db-fra.com

Rails 5, Méthode non définie `pour 'pour # pour <<Devise en ligne devise_parameter_sanitizer.for

Je travaille avec Rails 5

J'ai ajouté un nouveau nom d'utilisateur dans le modèle utilisateur.

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

Pendant l'enregistrement, l'erreur est affichée: méthode non définie `for 'pour # Vouliez-vous dire? Fork

Trace:

NoMethodError (méthode non définie `pour 'pour # Voulez-vous dire? 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)

Qui peut aider? Comment résoudre ce problème?

92
Dmitriy

According to the documentation:

L'API Parameter Sanitaizer a changé pour Devise 4

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

Si vous ne changez que le .for à .permit ça marche aussi. Par exemple:

devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :username) }

Cela fonctionne à la fois Rails 4.2.x et Rails 5.0.x

33
Brandy Burdick

N'oubliez pas devise_parameter_sanitizer.permit(:account_update, keys: [:username])

2
Dmitry Polyakovsky

Je pense que vous avez manqué account_update dans la méthode configure_permitted_parameters de votre contrôleur, vous devez suivre le modèle de schéma. Devise a une page de mise à jour de compte. Vous pouvez le trouver dans views/invent/registrations/edit.html.erb le code ne va pas non plus fonctionner dans la page sign_up, ici vous avez spécifié la page sign_up

Pour mettre à jour votre table d'utilisateurs, à la minute où vous soumettez une mise à jour dans vos utilisateurs/modifications, ou si vous soumettez un nom d'utilisateur sur la page de connexion, vous devez suivre ce modèle, pour mettre à jour la table d'utilisateurs de la base de données. Même si vous avez ajouté une nouvelle colonne à la table utilisateur, vous devez l’ajouter à la méthode configure_permitted_parameters. Dans votre cas, il s'agit du nom d'utilisateur, mais vous avez également manqué account_update. En gros, vous dites que vous voulez mettre à jour le nom d'utilisateur ou ajouter la chaîne au champ nom d'utilisateur sans suivre le modèle Devise. Tout champ que vous ajoutez à la table Utilisateur doit suivre ce modèle Devise. Vous pouvez également spécifier quelle page est autorisée à mettre à jour ce nom d'utilisateur. Dans mon exemple ci-dessous, j'utilise la page de mise à jour de carte. Donc, comme je l'ai dit, même si vous avez ajouté un nom de champ personnalisé à la table Utilisateurs, vous devez suivre ce modèle. Si vous avez une autre page où vous devez ajouter un nom d'utilisateur, vous feriez simplement la même chose.

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

Assurez-vous ensuite dans votre user.rb que vous avez un nom d'utilisateur valide dans votre modèle d'utilisateur.

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

  validates :username, presence: true
end
0
Elias Glyptis