【问题标题】:Rails validation best practiceRails 验证最佳实践
【发布时间】:2015-10-20 11:47:35
【问题描述】:

我的user 得到了这个验证:

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

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

案例 1) 当用户想要更新他的帐户(比如说更改他的用户名)时,表单只有 emailusername 字段。没关系,验证也没问题。

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

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

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

【问题讨论】:

  • 你说“案例2)不会通过,因为没有密码字段”是什么意思?
  • maxim pntyushenko:对不起,我打错了,这是“案例 1)不会通过”
  • 您在使用 Devise 吗?
  • 帕万:不,这没有帮助。当我尝试仅编辑/更新用户信息(电子邮件,用户名)时...验证未通过它会抛出(“密码不能为空”)
  • 不是 100% 确定这一点,但我认为您可以创建两个验证集。一种用于on: :create,一种用于on: :update。更新不包括存在或确认,只有长度。

标签: ruby-on-rails forms validation model


【解决方案1】:

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

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

def changing_password?
  self.password_scenario.present?
end

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

【讨论】:

  • 我写了一个使用这种方法的 gem,带有漂亮的蝴蝶结和包装纸:github.com/pdobb/conditional_validation
  • @pdobb +1 我不知道你的宝石。感谢您指出!
  • 非常感谢,这就是我一直在寻找的 :) 顺便说一句.. 是像破解它还是我可以在现实生活项目中使用的合法方法?
猜你喜欢
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2014-01-23
  • 2013-01-17
  • 2014-01-03
  • 2014-06-23
相关资源
最近更新 更多