Rails - 验证:如果一个条件为真
Posted
技术标签:
【中文标题】Rails - 验证:如果一个条件为真【英文标题】:Rails - Validation :if one condition is true 【发布时间】:2017-07-18 14:53:06 【问题描述】:在 Rails 5 上。
我有一个带有description
属性的Order
模型。如果满足以下两个条件之一,我只想验证它的存在:如果当前步骤等于第一步,或者如果 require_validation 等于 true。
我可以根据这样的一个条件轻松验证:
validates :description, presence: true, if: :first_step?
def first_step?
current_step == steps.first
end
但我不确定如何添加另一个条件并验证一个或另一个是否为真。
类似:
validates :description, presence: true, if: :first_step? || :require_validation
谢谢!
【问题讨论】:
【参考方案1】:您可以为 if:
子句使用 lambda 并执行 or 条件。
validates :description, presence: true, if: -> current_step == steps.first || require_validation
【讨论】:
漂亮的解决方案。【参考方案2】:你能用一种方法包装它吗?根据docs
:if - 指定要调用的方法、过程或字符串以确定是否应该进行验证(例如 if: :allow_validation 或 if: Proc.new |user| user.signup_step > 2 )。方法、过程或字符串应返回或评估为真或假值。
validates :description, presence: true, if: :some_validation_check
def some_validation_check
first_step? || require_validation
end
【讨论】:
【参考方案3】:您可以传递一个 lambda 以作为 if
条件进行评估。
试试:
validates :description, presence: true, if: -> first_step? || require_validation
【讨论】:
那不是 lambda 吗?一个块是:validates :description, presence: true, if: first_step? || require_validation
啊,你是对的。我应该说“你可以传递一个 lambda”。
:) 块也可以。 Rails 只是在使用它之前将其转换为 proc 或 lambda(我忘了是什么)。【参考方案4】:
如果您不想像 Jared 所说的那样添加一种方法,那么您可以尝试使用 lambda
validates :description, presence: true, if: -> first_step? || require_validation
【讨论】:
【参考方案5】:如果你有很多case,你可以设计验证
validates_presence_of :price_tech_fee, if: :price_tech_fee_require?, :message => :required
validates_presence_of :percentage_tech_fee, if: :percentage_tech_fee_require?, :message => :required
def percentage_tech_fee_require?
is_active? && is_transaction_percentage? && is_premium?
end
def is_active?
!self.is_deleted && self.is_active
end
def is_transaction_percentage?
self.is_per_transaction && self.is_percentage
end
def is_premium?
....
end
【讨论】:
约定说你不应该定义一个名为“is_,,”的方法,如果它应该返回一个布尔值。只需使用“?”最后(就像你做的那样)。以上是关于Rails - 验证:如果一个条件为真的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4 'has_secure_password' 验证空白密码并且无法执行条件验证