简单表单和必填字段:如果将条件添加到验证,则不视为必填
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? 处的代码),您会注意到如果存在验证器有一个条件,例如 if
或 unless
,则该字段为 no不再标记为必需。
我这样解决 :terms
作为一个复选框元素:
validates :terms, presence: true, acceptance: true
有了这个,它会在表单级别进行验证,以检查 'term' 复选框是否仅在选中后才提交。希望对以后的人有帮助。
如果您在验证中有条件,则简单的表单验证不起作用。
这是有意为之,因为您可以将任何内容放入 :if
或 :unless
中,调用它可能会导致意想不到的副作用。
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? 处的代码),您会注意到如果存在验证器有一个条件,例如 if
或 unless
,则该字段为 no不再标记为必需。
我这样解决 :terms
作为一个复选框元素:
validates :terms, presence: true, acceptance: true
有了这个,它会在表单级别进行验证,以检查 'term' 复选框是否仅在选中后才提交。希望对以后的人有帮助。
如果您在验证中有条件,则简单的表单验证不起作用。
这是有意为之,因为您可以将任何内容放入 :if
或 :unless
中,调用它可能会导致意想不到的副作用。