首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Simple-Form和required字段:如果将条件添加到验证中,则不将其视为必需字段

Simple-Form和required字段:如果将条件添加到验证中,则不将其视为必需字段
EN

Stack Overflow用户
提问于 2017-01-31 17:53:59
回答 4查看 970关注 0票数 0

Simple-Form自动检测是否存在validates :xxx, presence: true验证,并将该字段显示为必填字段(例如,在标签后附加一个星号)。

代码语言:javascript
复制
validates :parent, presence: true

这将导致:

有趣的是,只要我在这个验证中添加一个条件...

代码语言:javascript
复制
validates :parent, presence: true, if: -> { true }

...it不再这样做了:

这是一个bug还是一个特性?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-31 18:10:34

这是预期的行为,仅当您将对象保存到数据库时才会运行验证,因此在此之前您无法知道lambda是否返回true。当然,在您的情况下,它总是返回true,但是假设您的lambda中有一个时间约束,或者其他一些更复杂的条件,例如

代码语言:javascript
复制
...., -> { Time.zone.now > Date.new(2017, 1, 1) }

也许当您为表单创建对象时,它会返回false,但是当表单实际提交并保存到数据库时,返回true的时间已经足够长了。

因此,simple_form无法知道表单是在何时创建的,无论该字段是否为必填字段。

票数 2
EN

Stack Overflow用户

发布于 2017-01-31 18:11:34

你可以称它为一个特性,因为它是故意的。如果您查看gem代码(特别是在calculateconditional中),您会注意到,如果存在验证器有一个条件,如ifunless,则该字段不再标记为必填。

票数 0
EN

Stack Overflow用户

发布于 2017-07-19 19:44:02

对于:terms是一个复选框元素,我是这样解决的:

代码语言:javascript
复制
validates :terms, presence: true, acceptance: true

这样,它就可以在表单级别验证“term”复选框是否仅在选中后才会提交。希望对未来的人有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41954413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档