我有 4 个与 User 模型关联的表单,这就是我希望它们的行为方式 -
- 注册(新) - 需要密码 -
email, name, password, password_confirmation
- 编辑设置(编辑) - 不需要密码 -
email, name
- 更改密码- 需要密码,登录用户更改密码的页面 -
current_password, password, password_confirmation
- 重置密码- 需要密码,未经身份验证的用户在收到密码重置电子邮件后更改密码的页面 -
password, password_confirmation
我拥有的最接近的验证解决方案是 -
validates :password, presence: true, length: { minimum: 6 }, on: :update, if: lambda{ |u| u.password.blank? }
这将满足第 1、3 和 4 点,但它不允许用户更新属性,即def update
(第 2 点),因为没有params[:user][:password]
,因此{presence: true}
触发了验证。
只有当表单包含密码字段时validate_presence_of :password
,最好的方法是什么?