1

我正在使用 Rails 3.2.11、Mac OS X Mountain Lion、Ruby 1.9.3

所以我有这段代码:

class Points < ActiveRecord::Base
validates :id, :presence => true

before_create :validate_points

def validate_points
  if self.amount < 0
    Rails.logger.error "Invalid amount of points"
  else
    save!
  end
end

结尾

我想限制用户插入负值。但由于某种原因, validate_points 方法不起作用。有什么我做错了吗?谢谢。

4

2 回答 2

3

你应该使用validates_numericality_ofRails 提供的方法

validates :amount, numericality: { greater_than_or_equal_to: 0 }

更新:您的代码问题

您的代码有几个问题。

  1. 您正在使用before_createwhich 在记录保存到数据库之前被调用。以这种方式防止数据库提交的唯一方法是在回调中返回 false ,但这不是一个好习惯。
  2. validate_points调用save!,但在before_create回调中调用,因此您保存记录 2x更新:正如 rxing 所指出的,这将导致无限循环,而不是仅保存 2 次到数据库

如果您不想使用内置验证,请尝试以下操作

validate :validates_amount_points

def validates_amount_points
  errors.add_to :amount, 'must be greater than or equal to 0' if amount < 0
end
于 2013-03-07T06:41:24.830 回答
1

您需要使用“验证”而不是 before_create 钩子。顺便说一句,您的 before_create 也不正确。它会引发 SystemStackError: stack level too deep since "save!" 将递归触发 before_create。

于 2013-03-07T07:17:13.940 回答