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
相关产品推荐
相关产品推荐

