【问题标题】:Rails - Validation :if one condition is trueRails - 验证:如果一个条件为真
【发布时间】: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

谢谢!

【问题讨论】:

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


    【解决方案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_,,”的方法,如果它应该返回一个布尔值。只需使用“?”最后(就像你做的那样)。
        猜你喜欢
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 2012-08-06
        • 1970-01-01
        • 2015-05-14
        相关资源
        最近更新 更多