"未经许可的参数:current_password"在编辑用户时

时间:2017-06-10 01:39:22

标签: ruby-on-rails devise

有许多问题(例如:herehere)解决了这个问题(并且对于遇到同样问题的其他人有用),但它们都没有为我工作。

使用Rails 5.0.0和Devise 4.2,最终我尝试允许管理员编辑其他用户,并允许普通用户编辑自己的帐户。 This需要a few modifications,因为默认情况下,Devise不允许登录用户编辑其他用户。

users/:id/edit视图中的表单现在填充正确的用户,但更新失败,日志中包含Unpermitted parameter: current_password。我相信我需要将:current_password列入白名单,但这些建议都没有为我做到这一点。

的routes.rb

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

path_prefix" my"被建议作为避免Devise和:users资源之间路由冲突的方法。)

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

users_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

您可能想知道为什么我没有将:current_password添加到user_params。这样做会产生unknown attribute 'current_password' for User. error.(添加建议的attr_accessor没有帮助。)

这是我第一次需要自定义Devise。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

在UsersController中添加它 - &gt;&gt;&gt; user_params function - &gt;&gt;&gt;在许可证中,我认为你应该在许可证中添加......

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

  end

答案 1 :(得分:0)

终于解决了这个问题。我将the following添加到了UsersController的更新操作中:

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

由于它以静默方式失败,the following也有助于诊断更新操作:

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

谢谢大家!很高兴有这个解决。