Devise 3 (rails 4) ne peut pas mettre à jour l'utilisateur sans mot de passe
Je suis en train de mettre à jour un utilisateur sans avoir à fournir un mot de passe, mais les approches qui ont travaillé sur les anciens concevoir/rails de versions ne fonctionnent plus avec concevoir 3 et rails de 4 fortes paramètres.
Je suis avec mon user_controller de mise à jour, mais j'ai aussi essayé en utilisant une mesure de concevoir enregistrement contrôleur avec devise_parameter_sanitizer, sans succès.
La forme ne nécessite pas de mot de passe (n'a pas de champ de mot de passe) et le user_controller de la manipulation de la mise à jour ressemble à ceci:
# PATCH/PUT /users/1
def update
if user_params[:password].blank?
Rails.logger.info "entered if statement"
user_params.delete :password
user_params.delete :password_confirmation
Rails.logger.info(user_params.inspect)
end
@user = current_user
if @user.update(user_params)
redirect_to @user, notice: 'User was successfully updated.'
else
Rails.logger.info(@user.errors.inspect)
render action: 'edit'
end
end
private
def user_params
params.require(:user).permit(:screen_name, :full_name, :email, :about,
:location, :profile_pic, :password, :password_confirmation, :current_password)
end
.. le journal d'après un envoyer ressemble:
Started PATCH "/users/13" for 127.0.0.1 at 2013-05-29 11:18:18 +0100
Processing by UsersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"20avah2OzaOVubAiam/SgvbYEQ4iijEWQqmNo7xD4rY=", "user"=>{"screen_name"=>"Darcbar", "full_name"=>"Barry Darcy", "about"=>"", "location"=>"", "website_url"=>"", "twitter_username"=>"", "email"=>"[email protected]"}, "commit"=>"Save changes", "id"=>"13"}
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 13 ORDER BY "users"."id" ASC LIMIT 1
Entered if statement...
{"screen_name"=>"Darcbar", "full_name"=>"Barry Darcy", "email"=>"[email protected]", "about"=>"", "location"=>"", "twitter_username"=>"", "website_url"=>""}
(0.2ms) BEGIN
User Exists (0.8ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 13) LIMIT 1
(0.2ms) ROLLBACK
#<ActiveModel::Errors:0x007fedf45bb640 @base=#<User id: 13, username: "darcbar", full_name: "Barry Darcy", about: "", location: "", email: "[email protected]", encrypted_password: "$2a$10$Mb4zsRPPqZ9CYz0zdLMBU.62NyIk/T8s6Zw/uRTwWov3...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 9, current_sign_in_at: "2013-05-28 17:51:20", last_sign_in_at: "2013-05-28 16:42:52", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", authentication_token: nil, created_at: "2013-05-27 14:03:41", updated_at: "2013-05-28 17:51:20", screen_name: "Darcbar", profile_pic_file_name: nil, profile_pic_content_type: nil, profile_pic_file_size: nil, profile_pic_updated_at: nil>,
@messages={:password=>["please enter a password with at least 5 characters", "please enter a password with at least 5 characters"]}>
Rendered users/edit.html.haml within layouts/application (3.0ms)
Rendered partials/head/_user_options.haml (1.8ms)
Completed 200 OK in 74ms (Views: 12.1ms | ActiveRecord: 1.7ms)
Personne ne sait pourquoi le mot de passe des erreurs sont présentes?
source d'informationauteur Darcbar
Vous devez vous connecter pour publier un commentaire.
La validation du mot de passe est en provenance de l'utilisateur modèle:
La solution est de seulement de valider la présence sur créer et allow_blank sur mise à jour:
À partir de 2014, vous pouvez simplement remplacer une méthode protégée et à faire:
Vous pouvez utiliser
@user.update_without_password(user_params)
méthode pour mettre à jour votre d'autres domaines.Par exemple, j'ai ceci dans mon custom users_controller.rb. - Je mettre à jour d'appel à distance (ajax).
La clé est dans cette "user_params [mot de passe].vierge?". Le suivant est un exemple de code:
Espère que vous aider à
Je suis allé en rond sur ce pour les âges. Les réponses sont toutes dans le traitement pouvant être validé comme suggéré par mrstif ci-dessus. Si vous utilisez le module de traitement pouvant être validé Concevoir fonctionne hors de la boîte (avec des options de configuration) vous permettant de mettre à jour les détails de l'utilisateur sans fournir de mot de passe afin d'être très attention sur le déploiement de votre propre mot de passe de validation.
simplement remplacer le Concevoir par la création de app/controller/registrations_controller.rb
ce code sera directement mise à jour de l'utilisateur paramètres à l'exception de :current_password
et mise à jour config/routes.rb
Mon but était de permettre la modification des attributs d'utilisateur sans nécessiter un mot de passe, à moins qu'il change d'email, mot de passe ou de supprimer le compte. Et voici ce qui a fonctionné pour moi:
app/controllers/registrations_controller.rb:
Mise à jour de config/routes.rb:
Dans les vues/concevoir/inscriptions/modifier.html.haml