我有一个包含10个属性的表单。
其中我有4个属性,我需要应用我称之为“互为条件存在”的Active Record验证。
我想要那个
以下是四个属性:
这意味着如果用户填写其中一个,那么所有其他人必须在场。但如果一切都是空白的,那就没关系。
到目前为止,我只能设法强制执行(A)。但我未能实施(B)。
确实,当我尝试在4个属性验证中的一个上放置allow_blank:true时,它会中断(A),因为在此之后,它不能确保如果存在属性,则其他属性也必须如此。
怎么做?
这是我目前的代码
规格/模型/用户
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
答案 0 :(得分:1)
在我看来,它必须全部四个,或者都不是。未经测试,但这应该有效。
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
将为真。