在编辑字段值后进行自定义验证

时间:2010-12-23 01:12:44

标签: ruby-on-rails-3

基本上我有一个有金额和金钱领域的用户模型。当我第一次创建用户时,我验证user.amount <= user.money。但是,允许用户通过“编辑”更改金额。在更新操作中,当用户更改金额时,我通过

计算旧的和新的(旧的减去新的)金额之间的差异
  amount_change = user.amount - params[:user][:amount].to_f

我不知道这是不是好形式,但它对我有用。基本上我不存储差异并仅在用户试图改变金额时计算它。无论如何,当用户编辑时,我想验证amount_change <= user.money。我怎样才能做到这一点?我觉得我应该通过验证,但我不知道如何传递amount_change,因为它是在我的用户控制器的更新方法中计算的。 非常感谢!

1 个答案:

答案 0 :(得分:11)

您可以使用ActiveModel::Dirty访问旧值(amount_was):

class User < ActiveRecord::Base
  # ...
  validate :ensure_amount_change_less_than_money, 
           :on => :update, 
           :if => :amount_changed?

  def ensure_amount_change_less_than_money
    if (self.amount - self.amount_was) <= self.money
      errors.add(:money, 'Amount change must be less than money')
    end
  end
end