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

Ruby on rails Rails-验证:如果一个条件为真,ruby-on-rails,validation,ruby-on-rails-4,ruby-on-rails-5,Ruby On Rails,Validation,Ruby On Rails 4,Ruby On Rails 5,在轨道5上 我有一个带有description属性的Order模型。我只想在满足以下两个条件之一时验证它的存在:当前步骤是否等于第一步,或者require_validation是否等于true 我可以根据以下一个条件轻松验证: validates :description, presence: true, if: :first_step? def first_step? current_step == steps.first end 但我不知道如何添加另一个条件并验证其中一个条件是否正确

在轨道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

谢谢

你能用一种方法把它包装起来吗?根据

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


您可以对
if:
子句使用lambda并执行or条件

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

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

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

您可以传递lambda作为
if
条件进行计算

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


如果你有很多案例,你可以设计验证

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

那不是兰姆达吗?一个块应该是:
validates:description,presence:true,if:{first_step?| require_validation}
Ah,你是对的。我应该说“你可以通过一个lambda”。:)一个块也可以。Rails只是在使用它之前将其转换为proc或lambda(我忘了是什么)。这是一个很好的解决方案。
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