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
谢谢!
答案 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