【发布时间】:2014-08-29 00:00:11
【问题描述】:
我有一个 Rails 项目,与大多数应用程序一样,我们有许多严格的验证规则,所有对象在持久化之前都必须遵守这些规则。当然,ActiveModel 的 Validations 非常适合这一点 - 我们使用 Rails 默认值和我们自己的手动验证的组合。
不过,我们越来越多地遇到一些用例,我们希望提醒用户注意以下情况:虽然他们的数据在最严格的意义上不是无效的,但有些元素他们应该审查,但本身不应阻止记录持久性的发生。几个例子,我的脑海中浮现:
- 帖子标题已全部大写,可能有效,但可能无效
- 一段正文比建议字数少或多的 x 字数多
验证模块是我们如何处理验证错误的一个很好的比喻——并且已经有很多匹配器可用——理想情况下我希望能够重用该基本代码,但生成warnings的集合errors 旁边的项目。这将使我们能够以不同的方式向用户突出这些案例,而不是暗示可能违反房屋风格的行为等同于更恶劣、更严格执行的规则。
我查看了诸如 activemodel-warnings 之类的 gem,但它们的工作原理是在验证记录时更改检查哪些匹配器,相应地扩展或缩小 errors 集合。同样,我查看了内置的 :on 参数进行验证,看看我是否可以手动滚动某些内容,但所有违规行为最终都会出现在错误集合中,而不是被分离出来。
有人试过类似的吗?我无法想象我是唯一一个想实现这个目标的人,但现在我正在画一个空白......
【问题讨论】:
-
你看过这个问题的接受答案了吗? stackoverflow.com/questions/3342449/… 看来您可以创建一个单独的
ActiveModel::Errors并将其用作警告的存储 -
这绝对很有趣,本杰明,谢谢。这种方法确实意味着我们必须为警告编写单独的匹配器,而不是那些产生错误的匹配器,即使它们的内部结构是相同的。尽管存在代码重复的可能性,但我可能会接受这一点。一种重新调整用途的方法,例如,Rails 的内置长度验证匹配器能够根据调用上下文输出警告而不是错误......但如果它能让我到达我需要的地方,我准备好务实成为!
-
我没有深入研究它,但是看起来您将不得不复制所有这些验证类。快速浏览一下 Rails 源确认:
record.errors.add(attribute, ...)你需要record.warnings.add(attribute, ...) -
另外,它现在可能已经 3 岁了,但也许你可以在这个宝石中找到一些灵感github.com/stevehodgkiss/validation-scopes
-
是的,您必须重写所有匹配器可能是对的。我一直在玩弄将我的基类包装在装饰器中的可能性,使用它自己的错误对象来捕获一些验证,然后将它们作为单独的警告对象公开——但这似乎只是铲除了巨大的痛苦,因为一种避免一些潜在重复的方法……
标签: ruby-on-rails validation activemodel