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' 验证空白密码并且无法执行条件验证

ruby 我的博客文章“Rails中更好的条件验证”的片段

是的验证,如果一个字段为真,则使用 switch 语句检查另一个字段的值

如果条件使用 CSS

jQuery 验证以确保至少一个单选按钮值为真

数组上的PHP“如果为真”测试总是返回真?