【问题标题】:Rails 3 complicated validation designRails 3 复杂的验证设计
【发布时间】:2012-07-15 04:46:41
【问题描述】:

我有一个 Contribution 和 Reward 模型。一个贡献belongs_to一个奖励。我希望贡献只有其金额大于其奖励的minimum_contribution 才有效。

所以我有

Class Contribution < ActiveRecord::Base
  attr_accessible :reward_id, :reward
  belongs_to :reward

  validates_presence_of :amount
  validates_numericality_of :amount, greater_than: 0
  validates_presence_of :reward

  validates_each :amount, unless: SOMECONDITION do |contribution, attr, amount|
    reward = contribution.reward
    contribution.errors.add(attr,
                            "Contribution must be at least #{reward.minimum_contribution}") unless amount > reward.minimum_contribution
  end
end

我的问题是什么适合SOMECONDITION。在运行此验证之前,我需要确保

  1. 贡献的有效值已定义(甚至是数字)。否则在unless value &gt; reward.minimum_contribution 中比较会出错,因为您无法与 nil 进行比较
  2. 定义了贡献的奖励
  3. 贡献的奖励的 minimum_contribution 已定义且为数字

我应该在 SOMECONDITION 的 lambda 中做这一切吗?有这么多守卫来进行一次验证,这让人感觉有些不对劲。我是否正确设计了这个?在我的验证中抛出异常是否正确的设计,例如,unless amount &gt; contribution.reward.minimum_contribution 而amount 实际上是nil? (很明显,我总是希望数量是数字,但我不确定在验证中我应该有多偏执/我到底可以信任什么)

【问题讨论】:

    标签: ruby-on-rails validation associations


    【解决方案1】:

    您可以将validates_each :amount 替换为:

    ...
    validate :validate_mininum_amount
    
    def validate_mininum_amount
      errors.add :amount, "some error message" if amount.to_i < reward.min_contribution
    end
    ...
    

    注意:如果是nil,添加.to_i 可确保金额为0。或者,您可以为 nil 添加特定检查。在 validate_mininum_amount 方法中添加您需要的任何其他检查。

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 2012-02-09
      相关资源
      最近更新 更多