Rails验证最佳实践

5

我有一个针对我的用户的验证:

  validates :password,
  presence: true,
  confirmation: true,
  length: { minimum: 6 },
  :on => :create

这很明显。当我创建(注册)一个新的用户时,我想填写他们的密码,因此就有了presence:true
情况1)当用户想要更新他的帐户(比如更改用户名)时,表单只有电子邮件用户名字段。这是可以的,验证也是可以的。
情况2)他忘记了密码,我向他发送了“忘记密码链接”,他在创建新密码的页面上。表单有这两个字段:密码和密码确认。然而,他将这两个字段都留空并提交表单。验证通过因为它只是:on => create!因为情况1) 我不能添加:on => update,因为情况1)不会通过,因为没有密码字段。
在这种情况下我该怎么做?什么是最佳实践或解决这个“问题”的现实方法?

你说的“第二种情况不会通过,因为没有密码字段”是什么意思? - Maxim Pontyushenko
抱歉,我打错了,应该是“情况 1)无法通过”。 - Jakub Kohout
一种方法是在form(情况2)中的text_fields中添加required =>“required”,这样表单就无法提交空白密码。 - Pavan
忘记密码页面使用的操作名称是什么? - Pavan
该操作被称为“更新”。 - Jakub Kohout
显示剩余6条评论
1个回答

2

针对这种情况,我所做的是不使用on: :create,而是使用一个虚拟属性。只有在设置/更改密码时才设置它。类似于这样:

validates :password, if: :changing_password?
attr_accessor :password_scenario

def changing_password?
  self.password_scenario.present?
end

在你的控制器中,当你要求输入密码时,只需将password_scenario设置为true。


1
我写了一个宝石,使用这种方法并加上了漂亮的蝴蝶结和包装纸:https://github.com/pdobb/conditional_validation - pdobb
@pdobb +1 我不知道你的宝石。谢谢你指出来! - dgross
非常感谢,这正是我在寻找的 :) 顺便问一下.. 这是像黑客攻击一样的方式,还是我可以在实际项目中使用的合法方法? - Jakub Kohout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接