Ruby on rails 简单表单和必填字段:不';如果验证中增加了条件,则不按要求处理

Ruby on rails 简单表单和必填字段:不';如果验证中增加了条件,则不按要求处理,ruby-on-rails,validation,simple-form,required,Ruby On Rails,Validation,Simple Form,Required,Simple Form自动检测是否存在验证:xxx、存在:true的验证,并将字段显示为必填字段(例如,标签上附加了星号) 这导致: 有趣的是,只要我给这个验证添加一个条件 validates :parent, presence: true, if: -> { true } …它不再这样做了: 这是错误还是功能?这是预期的行为,只有在将对象保存到数据库时才会运行验证,因此在此之前,您无法知道lambda是否返回true。当然,在您的情况下,它总是返回true,但假设您的lambda中

Simple Form自动检测是否存在验证:xxx、存在:true的验证,并将字段显示为必填字段(例如,标签上附加了星号)

这导致:

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

validates :parent, presence: true, if: -> { true }
…它不再这样做了:


这是错误还是功能?

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

...., -> { Time.zone.now > Date.new(2017, 1, 1) }
当您为表单创建对象时,可能会返回
false
,但当表单实际提交并保存到数据库时,经过了足够的时间,才返回
true


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

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

...., -> { Time.zone.now > Date.new(2017, 1, 1) }
当您为表单创建对象时,可能会返回
false
,但当表单实际提交并保存到数据库时,经过了足够的时间,才返回
true


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

您可以将其称为功能,因为这是经过深思熟虑的。如果您查看gem代码(尤其是在和处),您会注意到,如果状态验证器有一个条件,如
If
除非
,则该字段不再按要求标记。

您可以将其称为功能,因为这是故意的。如果您查看gem代码(尤其是在和处),您会注意到,如果状态验证器有一个条件,如
If
除非
,则该字段不再标记为必需。我这样解决了
:terms
作为复选框元素:

validates :terms, presence: true, acceptance: true

这样,它在表单级别验证是否只有在选中“term”复选框后才提交该复选框。希望它对将来的人有所帮助。

我这样解决了
:术语作为复选框元素:

validates :terms, presence: true, acceptance: true
这样,它在表单级别验证是否只有在选中“term”复选框后才提交该复选框。希望它能帮助将来的人