如何验证一个字段或另一个字段的存在,但不是两个字段或至少一个字段?验证是否存在一个或另一个字段(XOR)
64
A
回答
111
如果条件语句添加到numericality验证,像这样你的代码将工作:
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, allow_nil: true
validates_numericality_of :payment, allow_nil: true
validate :charge_xor_payment
private
def charge_xor_payment
unless charge.blank?^payment.blank?
errors.add(:base, "Specify a charge or a payment, not both")
end
end
end
9
钢轨3.
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, :unless => proc{|obj| obj.charge.blank?}
validates_numericality_of :payment, :unless => proc{|obj| obj.payment.blank?}
validate :charge_xor_payment
private
def charge_xor_payment
if !(charge.blank?^payment.blank?)
errors[:base] << "Specify a charge or a payment, not both"
end
end
end
2
validate :father_or_mother
#Father姓或母姓例强制
def father_or_mother
if father_last_name == "Last Name" or father_last_name.blank?
errors.add(:father_last_name, "cant blank")
errors.add(:mother_last_name, "cant blank")
end
end
试试上面的简单例子。
7
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, allow_nil: true
validates_numericality_of :payment, allow_nil: true
validate :charge_xor_payment
private
def charge_xor_payment
if [charge, payment].compact.count != 1
errors.add(:base, "Specify a charge or a payment, not both")
end
end
end
,你甚至可以用3个或多个值做到这一点:
if [month_day, week_day, hour].compact.count != 1
31
我认为这是Rails的更地道3+:
如:用于验证的user_name
或email
一个是目前:
validates :user_name, presence: true, unless: ->(user){user.email.present?}
validates :email, presence: true, unless: ->(user){user.user_name.present?}
+18
这不处理“不是两个”标准 – 2014-06-03 01:22:27
0
我把我的答案在下面这个问题。在这个例子中:description
和:keywords
是字段,其中这一个不能为空:
validate :some_was_present
belongs_to :seo_customable, polymorphic: true
def some_was_present
desc = description.blank?
errors.add(desc ? :description : :keywords, t('errors.messages.blank')) if desc && keywords.blank?
end
相关问题
- 1. 验证是否存在一个或另一个或两个(或)
- 2. 验证是否存在来自另一个模型的字段
- 3. 使用客户端验证验证另一个字段中是否存在值
- 4. jQuery从一个或另一个部分验证两个字段
- 5. 验证两个字段中的一个字段是否为零
- 6. 公式验证一个字段对另一个字段
- 7. 如何从一个模型验证另一个模型中是否存在一个字段
- 8. Laravel验证:仅在另一个验证字段时验证字段
- 9. MVC验证 - 更新另一个字段?
- 10. 基于另一个字段的验证
- 11. 验证其中一个或另一个
- 12. Bootstrap x-editable:根据另一个值验证字段值
- 13. yii验证只有当另一个字段存在
- 14. 触发验证只在一个div或一个字段上
- 15. jQuery验证需要两个字段或一个其他字段
- 16. jQuery验证只验证一个字段
- 17. 要求一个或另一个字段
- 18. 验证空白字段后检查另一个验证规则
- 19. 如何确定一个字段是否正在验证中?
- 20. 验证存在从另一个模型
- 21. Rails - 如何验证日期的一个字段对另一个字段
- 22. 验证输入字段移动到另一个字段后,而不是在keydown
- 23. 验证另一个字段,如果文件字段不为空
- 24. 当另一个字段被更改时触发字段验证
- 25. 如何通过另一个字段值验证字段? Laravel 5.4
- 26. 基于另一个字段的值验证Django模型字段?
- 27. 如何根据另一个字段验证字段?
- 28. 依赖于另一个字段的条件字段验证
- 29. 根据Symfony中的另一个字段值验证字段
- 30. 将另一个字段添加到字段的验证器中
这就是所谓的完美的答案。谢谢@Semanticart – 2016-04-29 13:00:24
功能很好。但是,我无法获取表单页面上显示的错误。除非我在我的_form.slim上做'= @ invoice.errors [:base] [0]'之类的东西。有什么建议么? – 2016-05-18 17:36:36