2013-03-07 49 views
1

我使用Rails 3.2.11的Mac OS X山獅,紅寶石1.9.3before_validation在軌失敗

所以我有這樣一段代碼:

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方法不起作用。我做錯了什麼?謝謝。

回答

3

你應該Rails的使用提供了validates_numericality_of方法

validates :amount, numericality: { greater_than_or_equal_to: 0 } 

UPDATE:問題在你的代碼

有你的代碼中的幾個問題。

  1. 您正在使用before_create,它在記錄保存到數據庫之前被調用。以這種方式防止數據庫提交的唯一方法是在回調中返回false,但這不是一種好的做法。
  2. 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

您需要使用「有效性」,而不是before_create鉤。順便說一下,你的before_create也是不正確的。從「save!」開始,它會引發SystemStackError:堆棧層次過深。會遞減before_create。

+1

這是不正確的。 'before_create'只會觸發一次。如果是'before_save',那麼我會同意你的看法。 – jvnill 2013-03-07 07:32:55

+1

當您保存一個new_record時,before_create將被遞歸調用,因爲它沒有機會成爲一個「現有記錄」。 這就是爲什麼它會在before_create的死循環中。 – rxing 2013-03-07 07:48:35

+0

嗯有趣。現在我更多地思考它,你是對的。它永遠不會超過創造記錄的地步。很好的接收! – jvnill 2013-03-07 07:50:43