基本上我有一个有金额和金钱领域的用户模型。当我第一次创建用户时,我验证user.amount <= user.money
。但是,允许用户通过“编辑”更改金额。在更新操作中,当用户更改金额时,我通过
amount_change = user.amount - params[:user][:amount].to_f
我不知道这是不是好形式,但它对我有用。基本上我不存储差异并仅在用户试图改变金额时计算它。无论如何,当用户编辑时,我想验证amount_change <= user.money
。我怎样才能做到这一点?我觉得我应该通过验证,但我不知道如何传递amount_change
,因为它是在我的用户控制器的更新方法中计算的。
非常感谢!
答案 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