You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails使用当前密码更新密码时PasswordsController#update报模板不存在错误

问题原因
  • authenticate方法参数使用错误:该方法需要接收用户输入的明文旧密码字符串作为参数,你当前传入的是符号:password,会导致旧密码校验永远失败,外层if判断不通过,后续逻辑全部不执行。
  • 缺失失败分支处理逻辑:你当前的代码只处理了「用户已登录+旧密码校验通过+密码更新成功」这一种成功场景,只要任意一个条件不满足,控制器action不会执行任何redirect_to或者render操作,Rails会默认查找和action同名的模板(即passwords/update对应的模板文件),项目中不存在该模板就会抛出你看到的报错,返回204 No Content。
解决方案

首先确认你密码修改表单提交的旧密码对应的参数名,假设表单里旧密码字段的参数key为old_password,修正后的代码如下:

def update
  # 处理用户未登录的情况
  if @current_user.blank?
    redirect_to login_path, alert: '请先登录后操作'
    return
  end

  # 校验旧密码,传入用户输入的明文旧密码
  unless @current_user.authenticate(params[:old_password])
    flash.now[:alert] = '旧密码输入错误,请重新输入'
    render :edit
    return
  end

  # 执行密码更新
  if @current_user.update(password_param)
    notice_content = '密码重置成功'
    if @current_user.role.name == "admin"
      redirect_to admin_path, notice: notice_content
    else
      redirect_to show_path, notice: notice_content
    end
  else
    # 处理新密码不符合校验规则的失败场景
    flash.now[:alert] = @current_user.errors.full_messages.join('、')
    render :edit
  end
end

额外校验项

  • 确认你的参数白名单方法password_param已经正确放开了新密码、密码确认字段的权限,通常配置为params.require(:user).permit(:password, :password_confirmation)即可。
  • 如果你的表单中旧密码的字段名不是old_password,请将代码中params[:old_password]替换为你实际使用的参数key。

内容的提问来源于stack exchange,提问作者Shantosh Dishari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:24:05