简单形式和必填字段:如果条件添加到验证中,则不会按要求处理

时间:2017-01-31 09:53:59

标签: ruby-on-rails validation simple-form required

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

validates :parent, presence: true

这导致:

asterisk

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

validates :parent, presence: true, if: -> { true }

......它不再这样做了:

no asterisk

这是一个错误还是一个功能?

3 个答案:

答案 0 :(得分:1)

这是预期的行为,只有在将对象保存到db时才会运行验证,因此在此之前您无法知道lambda是否返回true。当然,在你的情况下,它总是返回true,但想象你的lambda或其他更复杂的条件有时间限制,例如。

...., -> { Time.zone.now > Date.new(2017, 1, 1) }

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

因此,无论是否需要该字段,simple_form都无法知道何时创建表单。

答案 1 :(得分:0)

你可以把它称为一个功能,因为它是故意的。如果您查看gem代码(特别是在calculate_requiredconditional_validators?),您会注意到如果状态验证程序有条件,例如ifunless,该字段不再标记为必填字段。

答案 2 :(得分:0)

我这样解决了:terms是一个复选框元素:

validates :terms, presence: true, acceptance: true

使用此功能,它会在表单级别验证是否仅在检查后才会提交“term”复选框。希望它能帮助将来的某个人。