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?
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
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
N'oubliez pas devise_parameter_sanitizer.permit(:account_update, keys: [:username])
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