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

but*_*bat 5 ruby-on-rails-3

基本上我有一个有金额和金钱领域的用户模型.当我第一次创建用户时,我验证了这一点user.amount <= user.money.但是,允许用户通过"编辑"更改金额.在更新操作中,当用户更改金额时,我计算旧的和新的(旧的减去新的)金额之间的差异

  amount_change = user.amount - params[:user][:amount].to_f
Run Code Online (Sandbox Code Playgroud)

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

bow*_*ior 11

您可以使用ActiveModel :: Dirty访问旧值(as 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
Run Code Online (Sandbox Code Playgroud)