需要当前密码来设置新密码



我希望用户在编辑个人资料时输入其当前密码。

这就是我的用户模型的样子:

attr_accessor :current_password
def current_password
  errors[:current_password] << 'Incorrect password' unless self.current_password == self.password
end
validate :current_password, on: :update

和我的控制器参数:

def user_params
  params.require(:user).permit(:email, :name, :current_password, :password, :password_confirmation, :phone)
end

和用户形成部分:

<div class="form-group">
  <%= f.label :password, "Current password" %>
  <%= f.password_field :current_password, class: "form-control", placeholder: "Current password" %>
</div>

但是我的堆栈级别太深了,它进入了验证循环。

我在做什么错?

此方法

def current_password
  errors[:current_password] << 'Incorrect password' unless self.current_password == self.password
end

呼叫自己:这就是为什么您会得到堆栈太深的错误 - 它被困在一个循环中,无休止地称呼自己。

您试图做的事情令人困惑,因为current_password方法正在覆盖attr_accessor :current_password创建的方法,实际上是进行了一些验证,而不仅仅是返回值。我会这样做:

attr_accessor :current_password
validate :current_password_same_as_password, on: :update
def current_password_same_as_password
  errors[:current_password] << 'Incorrect password' unless self.current_password == self.password
end

因此,在这里,我仅将attr_accessor方法留下:它们是简单的读写和写入实例变量方法。该验证具有不同的方法名称,因此它不会与访问者方法名称进行战斗。

current_password正在调用自己。您有无限的递归。

您基本上是这样做的:

def current_password
  self.current_password
end

正如其他答案时说您在current_password中有一个无限循环。我会将验证逻辑纳入其自己的方法。类似以下内容。

validate :has_correct_current_password, on: :update
def has_correct_current_password
  errors[:current_password] << 'Incorrect password' unless current_password == password
end

最新更新