需要当前密码才能设置新密码
Require current password to set a new password
我希望用户在编辑他们的个人资料时输入他们当前的密码。
这是我的用户模型的样子:
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
我希望用户在编辑他们的个人资料时输入他们当前的密码。
这是我的用户模型的样子:
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