Rails 5, méthode non définie `for 'for # <Devise on line devise_parameter_sanitizer.for

95

Je travaille avec Rails 5

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

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

Lors de l'enregistrement, une erreur s'affiche: méthode non définie `pour 'pour # Vouliez-vous dire? fourchette

Trace:

NoMethodError (méthode non définie `for 'for # Vouliez-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?

Dmitriy
la source
1
Cela se produit également sur Rails 4.2.
sekrett

Réponses:

173

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
Зелёный
la source
pour une raison quelconque, cela fonctionne, mais lorsque je redémarre les rails, il cesse de fonctionner à nouveau
K2xL
@ K2xL Vider votre bac? Oups, c'est octobre. Comment avez-vous résolu ce problème?
snowYetis
stop + restart spring, pehaps
phillyslick
1
Merci! Pour ceux qui ne souhaitent pas mettre à jour leur code, vous pouvez simplement ajuster votre Gemfile en conséquence - gem 'devise', '~> 3'trié pour moi.
Darragh Enright
34

Si vous changez juste le .forpour .permitqu'il fonctionne aussi bien. Par exemple:

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

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

Brandy Burdick
la source
2

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

Dmitry Polyakovsky
la source
1
Il n'a pas oublié, il a besoin de passer à une nouvelle syntaxe.
sekrett
0

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 devise. Devise a une page de mise à jour de compte. Vous pouvez le trouver dans views / devise / registrations / edit.html.erb, et votre code ne fonctionnera pas non plus dans la page sign_up, ici vous avez spécifié la page sign_up

Pour mettre à jour votre table utilisateur, à la minute où vous soumettez une mise à jour dans vos utilisateurs / modifier, ou si vous soumettez un nom d'utilisateur dans la page de connexion, vous devez suivre ce modèle de conception, pour mettre à jour la table utilisateur de la base de données. Même si vous avez ajouté une nouvelle colonne à la table utilisateur, vous devrez 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. Vous dites essentiellement que vous souhaitez mettre à jour le nom d'utilisateur ou ajouter la chaîne au champ du nom d'utilisateur sans suivre le modèle Devise. Tout champ que vous ajoutez à la table User 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 devise. Donc, comme je l'ai dit, même si vous avez ajouté un nom de champ personnalisé à la table Users, vous devez suivre ce modèle.

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

Ensuite, assurez-vous que dans votre user.rb vous avez validé le nom d'utilisateur dans votre modèle d'utilisateur.

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

  validates :username, presence: true
end
Elias Glyptis
la source
-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
Elias Glyptis
la source