我正在使用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方法不起作用。我做错了什么?感谢。
答案 0 :(得分:3)
您应该使用Rails提供的validates_numericality_of
方法
validates :amount, numericality: { greater_than_or_equal_to: 0 }
更新:代码问题
您的代码存在一些问题。
before_create
。以这种方式阻止数据库提交的唯一方法是在回调中返回false,但这不是一种好的做法。validate_points
调用save!
,但会在before_create
回调中调用,因此您将保存记录2x UPDATE:正如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
答案 1 :(得分:1)
您需要使用'validation'而不是before_create挂钩。 顺便说一下,你的before_create也不正确。它会引起SystemStackError:堆栈级别太深,因为“保存!”会递归地跳过before_create。