需要当前密码才能设置新密码

时间:2015-05-12 15:02:15

标签: ruby-on-rails ruby validation ruby-on-rails-4 grails-validation

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

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

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>

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

我做错了什么?

3 个答案:

答案 0 :(得分:2)

此方法

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方法:它们是对实例变量方法的简单读写。验证具有不同的方法名称,因此它不会与访问者方法名称作斗争。

答案 1 :(得分:1)

current_password正在调用自己。你有一个无限的递归。

你基本上是这样做的:

def current_password
  self.current_password
end

答案 2 :(得分:1)

正如其他人的回答所说,你在current_password中有一个无限循环。我会将验证逻辑拉出到自己的方法中。如下所示。

validate :has_correct_current_password, on: :update

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