Rails - 验证:如果一个条件为真

时间:2017-02-27 20:27:18

标签: ruby-on-rails validation ruby-on-rails-4 ruby-on-rails-5

On Rails 5.

我有一个Order模型,其description属性。如果满足以下两个条件之一,我只想验证它的存在:如果当前步骤等于第一步或者如果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

谢谢!

5 个答案:

答案 0 :(得分:24)

您可以将lambda用于if:子句并执行或条件。

validates :description, presence: true, if: -> {current_step == steps.first || require_validation}

答案 1 :(得分:8)

你能用一种方法包装吗?根据{{​​3}}

  

:if - 指定要调用的方法,proc或字符串,以确定是否应进行验证(例如,如果:: allow_validation,或者::proc.new {| user | user.signup_step> 2})。方法,proc或string应该返回或计算为true或false值。

validates :description, presence: true, if: :some_validation_check

def some_validation_check
    first_step? || require_validation
end

答案 2 :(得分:2)

您可以传递lambda作为if条件进行评估。

尝试:

validates :description, presence: true, if: -> { first_step? || require_validation }

答案 3 :(得分:1)

如果您不想像Jared所说的那样添加一个方法,那么您可以尝试使用lambda

validates :description, presence: true, if: ->{ first_step? || require_validation }

答案 4 :(得分:0)

如果情况很多,可以设计验证

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