Ruby on rails 设计更改密码不工作(未知属性:当前密码)

Ruby on rails 设计更改密码不工作(未知属性:当前密码),ruby-on-rails,devise,Ruby On Rails,Devise,我不太确定我做错了什么,但当用户试图在我的应用程序上更改他们的密码时,它会给出一个错误,即当前密码是未知属性 这是我的密码: def configure_devise_permitted_parameters registration_params = [:email, :password, :password_confirmation, :first_name, :last_name] if params[:action] == 'update' devise_paramet

我不太确定我做错了什么,但当用户试图在我的应用程序上更改他们的密码时,它会给出一个错误,即当前密码是未知属性

这是我的密码:

def configure_devise_permitted_parameters
  registration_params = [:email, :password, :password_confirmation, :first_name, :last_name]

  if params[:action] == 'update'
    devise_parameter_sanitizer.for(:user_update) {
      |u| u.permit(registration_params << :current_password)
    }
  elsif params[:action] == 'create'
    devise_parameter_sanitizer.for(:sign_up) {
      |u| u.permit(registration_params)
    }
  end
end

class RegistrationsController < Devise::RegistrationsController
  def update
    account_update_params = devise_parameter_sanitizer.sanitize(:user_update)

    if account_update_params[:password].blank?
      account_update_params.delete("password")
      account_update_params.delete("password_confirmation")
      account_update_params.delete("current_password")
    end

    @user = User.find(current_user.id)
    if @user.update_attributes(account_update_params)
      set_flash_message :notice, :updated
      sign_in @user, bypass: true
      redirect_to after_update_path_for(@user)
    else
      render "edit"
    end
  end

不要调用
@user.update\u attributes(account\u update\u params)
,因为
当前的\u密码
不是数据库中的字段(至少不是默认模式),请尝试调用
更新\u资源(@user,account\u update\u params)
由您继承的Deviate::RegistrationController提供。这反过来调用resource.update_与_密码(params),该密码由designe的
databaseauthenticable
模块提供,并在更新所有传递的其他参数之前检查
当前_密码


但是,看起来标准的DevisionController::RegistrationsController.update()将支持您想要的以及更多(例如,如果更新需要确认电子邮件,则进行处理);您需要覆盖它有什么原因吗?

对我来说,它的工作原理是:

编辑app/controllers/application_controller.rb

并添加以下代码

protected

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation) }
end
protected

def update_resource(resource, params)
  resource.update_without_password(params)
end
编辑/app/controllers/users/registrations\u controller.rb

并添加以下代码

protected

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation) }
end
protected

def update_resource(resource, params)
  resource.update_without_password(params)
end
并添加以下路径

devise_for :users, controllers: {registrations: 'registrations'}
然后,在尝试保存更改而不确认密码时,我没有返回任何问题。

从Desive 4开始

获取“当前密码”的未知属性时, 无需使用
设计参数\u消毒剂

进入app/controllers/registrations\u controller.rb

改变

def update_resource(resource, params)
    resource.update_without_password(params)
end


今天我对Ruby、Rails和Desive的以下版本也有同样的问题:

  • ruby-2.4.0
  • 轨道-5.1.4
  • 设计-4.3.0
以下是我的解决方案:

app/controllers/registrations\u controller.rb中创建注册控制器

你到底是从哪里得到错误的?您是否可以共享错误stacktrace.getting行上的错误:@user.update\u atributes(account\u update\u params)。
class RegistrationsController < Devise::RegistrationsController

  protected

  def update_resource(resource, params)
    # Require current password if user is trying to change password.
    return super if params["password"]&.present?

    # Allows user to update registration information without password.
    resource.update_without_password(params.except("current_password"))
  end
end
# config/routes.rb
devise_for :users, controllers: { registrations: "registrations" }