Simple-Form会自动检测是否有validates :xxx, presence: true
验证,并将该字段显示为必填字段(例如,在标签后附加星号)。
validates :parent, presence: true
这导致:
有趣的是,只要我在此验证中添加条件......
validates :parent, presence: true, if: -> { true }
......它不再这样做了:
这是一个错误还是一个功能?
答案 0 :(得分:1)
这是预期的行为,只有在将对象保存到db时才会运行验证,因此在此之前您无法知道lambda是否返回true。当然,在你的情况下,它总是返回true
,但想象你的lambda或其他更复杂的条件有时间限制,例如。
...., -> { Time.zone.now > Date.new(2017, 1, 1) }
也许当您为表单创建对象时,这将返回false
,但是当表单实际提交并保存到数据库时,已经过了足够的时间让它返回true
。
因此,无论是否需要该字段,simple_form都无法知道何时创建表单。
答案 1 :(得分:0)
你可以把它称为一个功能,因为它是故意的。如果您查看gem代码(特别是在calculate_required和conditional_validators?),您会注意到如果状态验证程序有条件,例如if
或unless
,该字段不再标记为必填字段。
答案 2 :(得分:0)
我这样解决了:terms
是一个复选框元素:
validates :terms, presence: true, acceptance: true
使用此功能,它会在表单级别验证是否仅在检查后才会提交“term”复选框。希望它能帮助将来的某个人。