简单表单和必填字段:如果将条件添加到验证,则不视为必填

Simple-Form and required fields: doesn't treat as required if condition added to validation

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

validates :parent, presence: true

这导致:

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

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

...它不再这样做了:

这是错误还是功能?

这是预期的行为,仅当您将对象保存到数据库时才 运行 进行验证,因此在此之前您无法知道 lambda return 是否为真。当然在你的情况下它总是 returns true,但是想象你的 lambda 或其他一些更复杂的条件有时间限制,例如

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

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

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

您可以将其称为功能,因为它是经过深思熟虑的。如果您查看 gem 代码(尤其是 calculate_required and conditional_validators? 处的代码),您会注意到如果存在验证器有一个条件,例如 ifunless,则该字段为 no不再标记为必需。

我这样解决 :terms 作为一个复选框元素:

validates :terms, presence: true, acceptance: true

有了这个,它会在表单级别进行验证,以检查 'term' 复选框是否仅在选中后才提交。希望对以后的人有帮助。

如果您在验证中有条件,则简单的表单验证不起作用。

这是有意为之,因为您可以将任何内容放入 :if:unless 中,调用它可能会导致意想不到的副作用。

来源:https://github.com/heartcombo/simple_form/issues/322