rails中的before_validation失败

时间:2013-03-07 06:37:54

标签: ruby-on-rails ruby-on-rails-3

我正在使用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方法不起作用。我做错了什么?感谢。

2 个答案:

答案 0 :(得分:3)

您应该使用Rails提供的validates_numericality_of方法

validates :amount, numericality: { greater_than_or_equal_to: 0 }

更新:代码问题

您的代码存在一些问题。

  1. 您正在使用在将记录保存到数据库之前调用的before_create。以这种方式阻止数据库提交的唯一方法是在回调中返回false,但这不是一种好的做法。
  2. validate_points调用save!,但会在before_create回调中调用,因此您将保存记录2x UPDATE:正如rxing指出的那样,这将导致无限循环而不只是2次保存到数据库
  3. 如果您不想使用内置验证,请尝试以下

    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。