Rails 4 个活动记录验证 - 有条件地验证 4 个属性的相互依赖存在
Rails 4 active record validation - Conditionally validate interdependent presence of 4 attributes
我有一个包含 10 个属性的表单。
其中我有 4 个属性,我需要应用我所谓的 "mutually conditional presence" Active Record 验证。
这些属性是
- address_line_1
- 邮政编码
- 状态
- 国家
这意味着如果用户填写其中一个,那么所有其他人都必须存在
到目前为止我只能说,如果用户填写了第一个属性 "address line 1",那么其他所有属性都必须存在。
但它并不能验证所有可能组合中的所有 MUTUAL 存在。例如,如果用户让 'address line 1' 为空但填写邮政编码并将其他三个留空,我希望活动记录不要验证表单,因为他应该被要求填写其他三个属性。依此类推。
如何操作?
这是我当前的代码
spec/models/users
validates :address_line_1,
presence: true,
length: { maximum: 100,
minimum: 3 }
validates :zipcode,
presence: true, if: :address_line_1?,
length: { maximum: 20,
minimum: 4}
validates :state,
presence: true, if: :address_line_1?,
validates :country,
presence: true, :address_line_1?,
length: { maximum: 50}
只需将 :address_line?
条件替换为检查其中一个填写的字段:
validates :address_line_1,
presence: true, if: :address_entered?,
length: { maximum: 100,
minimum: 3 }
validates :zipcode,
presence: true, if: :address_entered?,
length: { maximum: 20,
minimum: 4
validates :state,
presence: true, if: :address_entered?,
validates :country,
presence: true, if: :address_entered?,
length: { maximum: 50}
def address_entered?
address_line_1.present? || zipcode.present? || state.present? || country.present?
end
我有一个包含 10 个属性的表单。
其中我有 4 个属性,我需要应用我所谓的 "mutually conditional presence" Active Record 验证。 这些属性是
- address_line_1
- 邮政编码
- 状态
- 国家
这意味着如果用户填写其中一个,那么所有其他人都必须存在
到目前为止我只能说,如果用户填写了第一个属性 "address line 1",那么其他所有属性都必须存在。
但它并不能验证所有可能组合中的所有 MUTUAL 存在。例如,如果用户让 'address line 1' 为空但填写邮政编码并将其他三个留空,我希望活动记录不要验证表单,因为他应该被要求填写其他三个属性。依此类推。
如何操作?
这是我当前的代码
spec/models/users
validates :address_line_1,
presence: true,
length: { maximum: 100,
minimum: 3 }
validates :zipcode,
presence: true, if: :address_line_1?,
length: { maximum: 20,
minimum: 4}
validates :state,
presence: true, if: :address_line_1?,
validates :country,
presence: true, :address_line_1?,
length: { maximum: 50}
只需将 :address_line?
条件替换为检查其中一个填写的字段:
validates :address_line_1,
presence: true, if: :address_entered?,
length: { maximum: 100,
minimum: 3 }
validates :zipcode,
presence: true, if: :address_entered?,
length: { maximum: 20,
minimum: 4
validates :state,
presence: true, if: :address_entered?,
validates :country,
presence: true, if: :address_entered?,
length: { maximum: 50}
def address_entered?
address_line_1.present? || zipcode.present? || state.present? || country.present?
end