自定义rails验证

时间:2010-12-20 07:15:12

标签: ruby-on-rails

我不确定实现这个的最佳方法是什么 - 基本上我想检查我的模型的start_amount字段是否在0到user.amount的范围内。 我不确定如何说'user.amount',因为它不像其他验证那样静态。

(作为参考,我做了 validates_numericality_of :start_amount, :allow_nil => false, :greater_than => 0

然后在同一模型中做到了这一点:

def validates
    self.errors.add(:start_amount, "is out of range") unless self.amount_in_allowed_range
  end

  def amount_in_allowed_range
    start_amount <= user.amount
  end

这很简单,所以我不认为需要为验证创建另一个类(也许这是它唯一的工作方式?) 它工作正常,除非我将start_amount留空,在这种情况下它正在比较nil <= user.amount并给出了一个错误(我认为这很奇怪,因为它应该在validates_numericality_of中检查它 - 但我想首先运行自定义验证。然后我使用:allow_nil => false将其更改为上述内容,并在我的迁移中将其设置为:null => false, :default => 0。现在它似乎根本没有检查?或者它永久为0,因此总是通过验证......)

我真的很喜欢rails并且非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

validates_numericality_of :start_amount
validate :amount_in_allowed_range

def amount_in_allowed_range
   self.errors.add(:start_amount, "is out of range") unless start_amount <= self.user.amount
end

如果您当前的模型与用户之间存在belongs_to关系,则应该有效。请注意,自定义验证方法声明为单数(validate而不是validates)。此外,默认情况下allow_nil为false。而且我不确定为什么:default => 0在您的路线中设置了?你的意思是迁移吗?请详细说明您的设置是什么样的。将niluser.amount进行比较后会出现什么样的错误?