0

改革宝石主张不在模型中进行验证。相反,它提倡他们保持形式。

模型验证

...

有时,当您仍然在模型中保留验证(您不应该这样做)时,将它们复制到表单可能感觉不对。在这种情况下,您可以让改革自动复制它们。

...

请注意,我们不鼓励复制验证。您应该将验证代码移动到表单中,而不是直接在您的模型上工作。

改革 gem 项目或其作者给出的没有在模型中进行验证的理由是什么?

4

1 回答 1

3

我会将验证分为两个不同的类别:

  • 数据的完整性
  • 商业逻辑

数据完整性意味着模型不能在不满足某些标准的情况下使用。您需要确保模型在此状态下永远不会被视为有效。然而,大多数情况下,这涉及到与持久性相关的诸如唯一性之类的事情。因此,这些约束最好在数据库级别而不是模型中强制执行。

另一方面,业务逻辑与应用程序的功能需求直接相关。

举个例子:当用户注册时,我只希望他填写他的电子邮件,但当他编辑他的个人资料时,我想确保他也填写他的名字姓氏

考虑到验证属于模型,您需要开始使用条件验证来混淆它。在这里,您将在验证模型是否已经持久化之前进行检查,这样就可以解决问题。但是添加更多具有不同要求的表单,这很快就会变得难以管理。

这是因为验证逻辑取决于应用程序的上下文(用户填写的表单、调用的 API 端点……)。您想要验证此应用程序上下文所需的参数是否有效,而不是模型状态。

如果您为每个上下文设置不同的验证集,事情就会变得更加容易和可维护。这导致要编写更多代码,但逻辑更清晰且可维护。

于 2015-10-28T12:41:35.320 回答