Rails 4 个活动记录验证 - 如果至少存在一个属性,则有条件地验证是否存在 4 个属性,同时允许 none 存在
Rails 4 active record validation - conditionally validate presence of 4 attributes if at least one is present while allowing none to be present
我有一个包含 10 个属性的表单。
其中我有 4 个属性,我需要应用我所谓的 "mutually conditional presence" 活动记录验证。
我想要那个
- (A) 如果至少有一个,那么另外三个必须存在
- (B) 仍然允许 none 存在(如果其他 3 个为空,则第四个有权为空)
以下是四个属性:
- address_line_1
- 邮政编码
- 状态
- 国家
这意味着如果用户填写其中一个,那么所有其他人都必须存在。但是如果全是空的就ok了。
到目前为止,我只能设法执行 (A)。但是我没有实现(B)。
事实上,当我尝试将 allow_blank: true 放在 4 个属性之一上进行验证时,它会中断 (A) ,因为在那之后,它不能确保是否存在一个属性,其他人也必须如此。
如何操作?
这是我当前的代码
spec/models/users
validates :address_line_1,
presence: true, if: :pa_subelements_mutual_presence?
length: { maximum: 100,
minimum: 3 }
validates :zipcode,
presence: true, if: :pa_subelements_mutual_presence?,
length: { maximum: 20,
minimum: 4}
validates :state,
presence: true, if: :pa_subelements_mutual_presence?,
validates :country,
presence: true, if: :pa_subelements_mutual_presence?,
length: { maximum: 50}
private
def pa_subelements_mutual_presence? # method to help set validates on mutually dependent for presence for postal address
lambda { self.address_line_1.present? } ||
lambda { self.zipcode.present? } ||
lambda { self.state.present? } ||
lambda { self.country.present? }
end
在我看来,它必须是所有四个或 none。未经测试,但这应该有效。
validate :all_or_none
private
def all_or_none
errors[:base] << "all or nothing, dude" unless
(address_line_1.blank? && zipcode.blank? && state.blank? && country.blank?) ||
(!address_line_1.blank? && !zipcode.blank? && !state.blank? && !country.blank?)
end
all_or_none
如果所有四个字段都为空或者其中 none 为真。
我有一个包含 10 个属性的表单。
其中我有 4 个属性,我需要应用我所谓的 "mutually conditional presence" 活动记录验证。
我想要那个
- (A) 如果至少有一个,那么另外三个必须存在
- (B) 仍然允许 none 存在(如果其他 3 个为空,则第四个有权为空)
以下是四个属性:
- address_line_1
- 邮政编码
- 状态
- 国家
这意味着如果用户填写其中一个,那么所有其他人都必须存在。但是如果全是空的就ok了。
到目前为止,我只能设法执行 (A)。但是我没有实现(B)。
事实上,当我尝试将 allow_blank: true 放在 4 个属性之一上进行验证时,它会中断 (A) ,因为在那之后,它不能确保是否存在一个属性,其他人也必须如此。
如何操作?
这是我当前的代码
spec/models/users
validates :address_line_1,
presence: true, if: :pa_subelements_mutual_presence?
length: { maximum: 100,
minimum: 3 }
validates :zipcode,
presence: true, if: :pa_subelements_mutual_presence?,
length: { maximum: 20,
minimum: 4}
validates :state,
presence: true, if: :pa_subelements_mutual_presence?,
validates :country,
presence: true, if: :pa_subelements_mutual_presence?,
length: { maximum: 50}
private
def pa_subelements_mutual_presence? # method to help set validates on mutually dependent for presence for postal address
lambda { self.address_line_1.present? } ||
lambda { self.zipcode.present? } ||
lambda { self.state.present? } ||
lambda { self.country.present? }
end
在我看来,它必须是所有四个或 none。未经测试,但这应该有效。
validate :all_or_none
private
def all_or_none
errors[:base] << "all or nothing, dude" unless
(address_line_1.blank? && zipcode.blank? && state.blank? && country.blank?) ||
(!address_line_1.blank? && !zipcode.blank? && !state.blank? && !country.blank?)
end
all_or_none
如果所有四个字段都为空或者其中 none 为真。