Rails 密码重置记录未找到

Posted

技术标签:

【中文标题】Rails 密码重置记录未找到【英文标题】:Rails password_reset recordnotfound 【发布时间】:2014-08-10 15:03:15 【问题描述】:

当我传入我的 url 以重置我的密码时出现错误,例如:localhost:3000/password_reset/SADASIJDSIDJ1231231/edit

def edit
    @user = User.find_by_password_reset_token!(params[:id])
  end

这是我的应用程序控制器(注意“包含 SessionsHelper”)

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.

  #om du lägger till kod här kmr inte sessions funka när du är inloggad wtf???
  #tog bort detta protect_from_forgery with: :exception
  include SessionsHelper
  protect_from_forgery 

   private

  def current_user
    @current_user ||= User.find_by_auth_token(cookies[:auth_token]) if cookies[:auth_token]
  end
  helper_method :current_user

end

这是我的密码重置控制器

class PasswordResetsController < ApplicationController
  def new
  end

 def create
    user = User.find_by_email(params[:email])
    user.send_password_reset if user
    redirect_to root_url, :notice => "Email sent with password reset instructions."
  end

  def edit
    @user = User.find_by_password_reset_token!(params[:id])
  end

  def update
    @user = User.find_by_password_reset_token!(params[:id])
    if @user.password_reset_sent_at < 2.hours.ago
      redirect_to new_password_reset_path, :alert => "Password reset has expired."
    elsif @user.update_attributes(params.permit![:user])
      redirect_to root_url, :notice => "Password has been reset!"
    else
      render :edit
    end
  end
end

我是如何解决的:

感谢 jorge,我知道 password_reset_token 没有在数据库中生成。所以我回到了我的模型/user.rb

def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    save!
    UserMailer.password_reset(self).deliver
  end

我添加了“保存!”之前是“保存”。然后我收到另一个错误,说密码不能为空。

所以我删除了这两行

 # validates :password, length:  minimum: 6 , presence: true
  #validates :password_confirmation, presence: true 

我添加了这一行

  validates_presence_of :password, :on => :create

现在一切正常。感谢您的耐心乔治。我欠你一大笔。

【问题讨论】:

粘贴你的 routes.rb 相关行 好的,我更新了我的帖子 在 find_by 之前粘贴 params[:id]。 数据库中有password_reset_token字段吗? 这样吗? “@user = User.(params[:id])find_by_password_reset_token!”这给了我另一个错误 【参考方案1】:

您是否使用密码重置令牌“SADASIJDSIDJ1231231”检查了数据库中存在的用户?

看起来下面这行没有找到用户:

@user = User.find_by_password_reset_token!(params[:id]) 

请包含您的 User 类 - send_password_reset 方法可能无法正确保存令牌。

【讨论】:

你猜对了,令牌不在数据库中。 OMYFREAKINGGOD 谢谢豪尔赫的指导。我会更新我的答案,说明我是如何解决它的......!!!

以上是关于Rails 密码重置记录未找到的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak - 重置密码时未显示用户未找到的消息信息

从 Rails 控制台设计密码重置

任意用户密码重置的10种常见姿势

重置设计 rails 的密码会导致“没有将数组隐式转换为字符串”错误

任意用户密码重置:重置凭证未校验

Rails 4 + 设计:密码重置总是在生产服务器上给出“令牌无效”错误,但在本地工作正常。