web-dev-qa-db-fra.com

Comment spécifier devise_parameter_sanitizer pour l'action d'édition?

J'ai ajouté Devise à mon application Rails 4, et j'ai réussi à ajouter le nom d'utilisateur, etc. à mon modèle d'utilisateur. De plus, je suis en mesure de stocker ces champs à l'aide de lazy way ™, c'est-à-dire.

class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) } 
    end
end

Cependant, j'ai essayé

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) }
  devise_parameter_sanitizer.for(:edit) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) }
end

mais cela n'a pas fonctionné comme prévu (le nom d'utilisateur n'est pas stocké lorsqu'il est appelé par l'action d'édition). Y a-t-il autre chose que je dois faire pour que cela fonctionne? Merci!

50
conciliator

Encore une fois, il s'agissait de lire le manuel ...

Le mot magique est :account_update et donc la version de travail devient

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname, :nickname) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end

Notez que si vous souhaitez vous connecter à l'aide de paramètres non standard, le mot que vous recherchez est :sign_in (comme prévu).

85
conciliator

Pour Devise 4.1+

class ApplicationController < ActionController::Base    
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :email])
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :phone, :email, bank_attributes: [:bank_name, :bank_account]])
  end
end

Le .for la méthode est obsolète, maintenant nous utilisons .permit

Le premier argument est le nom de l'action. :sign_up sert à créer de nouvelles ressources Devise (telles que des utilisateurs) et :account_update sert à éditer/mettre à jour la ressource.

Le deuxième argument, :keys contient un tableau des paramètres que vous autorisez.

Si tu veux nested_attributes, il y a un exemple dans :account_update, vous mettez un tableau séparé avec la clé étant <object>_attributes.

54
Mirror318

@conciliator a raison sur la magie Le mot est: account_update mais voici le lien vers la documentation à laquelle il a fait allusion http://rubydoc.info/github/plataformatec/devise/ Recherchez 'devise_parameter_sanitizer' et vous '' Je vais voir ce qui suit:

Il n'y a que trois actions dans Devise qui permettent à n'importe quel ensemble de paramètres d'être transmis au modèle, nécessitant donc un nettoyage. Leurs noms et les paramètres autorisés par défaut sont:

sign_in (Devise::SessionsController#new) - Permits only the authentication keys (like email)
sign_up (Devise::RegistrationsController#create) - Permits authentication keys plus password and password_confirmation
account_update (Devise::RegistrationsController#update) - Permits authentication keys plus password, password_confirmation and current_password
15
techbrownbags
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email,   :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end
6
lypef