Rails验证最佳实践

Jak*_*out 5 forms validation model ruby-on-rails

我有这个验证user:

  validates :password,
  presence: true,
  confirmation: true,
  length: { minimum: 6 },
  :on => :create
Run Code Online (Sandbox Code Playgroud)

这很明显.当我创建(注册)新的时user,我想填写他们的密码,因此这就是原因presence: true.

案例1)当用户想要更新他的帐户(让我们说改变他的用户名)时,表单只有emailusername字段.没关系,验证还可以.

案例2)他忘记了密码,我将他的"忘记密码链接"发送给他,他正在创建新密码的页面上.表单包含以下两个字段:密码和密码确认.但是,他将这两个字段都留空并提交表单.验证通过,因为它是唯一的:on => create!因为案例1)

我无法添加,:on => update因为案例1)不会通过,因为没有密码字段.

在这种情况下我该怎么办?什么是最佳实践或这个"问题"的真正解决方案是什么?

dgr*_*oss 2

我针对这种情况所做的不是使用on: :create,而是使用仅在设置/更改密码时设置的虚拟属性。像这样的东西:

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

def changing_password?
  self.password_scenario.present?
end
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中,只要你需要密码,你只需将password_scenario设置为true即可。