2017-06-10 3 views
2

Es gibt zahlreiche Fragen (zB: here und here), die dieses Problem beheben (und waren nützlich für andere mit dem gleichen Problem), aber keiner von ihnen hat noch für mich gearbeitet."Unerreichter Parameter: current_password" beim Bearbeiten von Benutzer

Mit Rails 5.0.0 und Devise 4.2, schließlich versuche ich Admins zu erlauben, andere Benutzer zu bearbeiten und regelmäßigen Benutzern zu erlauben, ihre eigenen Konten zu bearbeiten. This erforderlich a few modifications, da Devise den eingeloggten Benutzer standardmäßig nicht berechtigt, andere Benutzer zu bearbeiten.

Das Formular in der users/:id/edit Ansicht wird jetzt mit dem richtigen Benutzer ausgefüllt, aber die Aktualisierung schlägt fehl, mit Unpermitted parameter: current_password in den Protokollen. Ich glaube, dass ich :current_password Whitelist muss, aber keiner der Vorschläge erreicht dies für mich.

routes.rb

devise_for :users, controllers: {registrations: 'registrations'}, path_prefix: 'my' 
resources :users 

(Die path_prefix "my" als eine Möglichkeit vorgeschlagen wurde Route Konflikte zwischen Einfallsreichtum und die :users Ressource. Zu vermeiden)

registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController 
    before_action :configure_permitted_parameters, if: :devise_controller? 


    ... 

    protected 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) do |u| 
     u.permit(:password, :password_confirmation) 
    end 

    devise_parameter_sanitizer.for(:account_update) do |u| 
     u.permit(:password, :password_confirmation, :current_password) 
    end 
    end 
end 

verwenden rs_controller.rb

class UsersController < ApplicationController 
    before_action :set_user, only: [:edit, :show, :update, :destroy] 

    ... 

    def edit 
    end 


    def update 
    @user = User.find(params[:id]) 
    if @user.update(user_params) 
     redirect_to cohorts_path 
    else 
     render 'edit' 
    end 
    end 

    private 

    def set_user 
    @user = User.find(params[:id]) 
    end 

    def user_params 
    params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :roles, :nickname, :location, :headshot, :goals) 

    end 
end 

Sie fragen sich vielleicht, warum ich nicht :current_password zum user_params hinzugefügt haben. Dies führt zu einem unknown attribute 'current_password' for User. error. (Hinzufügen der vorgeschlagenen attr_accessor hat nicht geholfen.)

Dies ist das erste Mal, dass ich Devise anpassen musste. Jede Hilfe wird geschätzt!

+0

Was erhalten Sie, wenn Sie 'User.column_names' in Ihrer Konsole eingeben? –

+0

=> [ "id", "E-Mail", "verschluesseltes_passwort", "reset_password_token", "reset_password_sent_at", "remember_created_at", "sign_in_count", "current_sign_in_at", "last_sign_in_at", " current_sign_in_ip " "last_sign_in_ip" "created_at" "updated_at" "Rollen", "first_name" "last_name" "current_cohort" "Spitznamen" "location", " Ziele ", " er adshot "] Muss current_password ein Mitglied dieser Liste sein? Ich denke, ich dachte, es wäre ein "Pseudo" -Parameter. –

+0

@ JonathanDueck - Nein, Sie müssen auf keinen Fall 'current_password' in die Liste aufnehmen. Devise macht diesen Parameter ausschließlich für die Kontoaktualisierungsaktion des Benutzers verfügbar. – 31piy

Antwort

0

gelöst Schließlich dies. Ich habe the following auf die Update-Aktion meines Userscontroller:

if params[:user][:password].blank? && params[:user[:password_confirmation].blank? 
    params[:user].delete(:password) 
    params[:user].delete(:password_confirmation) 
end 

Da es still versagt, the following war auch hilfreich bei der Diagnose der Update-Aktion:

Rails.logger.info(@your_object.errors.inspect) 

Dank all! Freut mich, das gelöst zu haben.

0

es in Userscontroller hinzufügen - >>> user_params Funktion - >>> in der Genehmigung, ich glaube, Sie es in Erlaubnis hinzufügen sollten ...

def user_params 
    params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :roles, :nickname, :location, :headshot, :goals, :current_password) <<<< THERE 

    end 
+0

Ich bestätige, dass ich attr_accessor: current_password in User.rb habe und dass: current_password in user_params in UsersController erlaubt wurde. Ich bekomme BEGIN und ROLLBACK, mit keine Fehlermeldung, um anzuzeigen, warum das Update nicht auftritt. –

+0

Haben Sie generieren Registrierung Registrierungscontroller mit diesem Befehl? Rails generieren Devise: Controller Benutzer –

+0

Ich schrieb die UsersController und RegistrationsController manuell. (Ich war mir nicht bewusst, dass Sie Devise-Controller in der von Ihnen vorgeschlagenen Weise generieren können.) –

Verwandte Themen