2013-05-15 61 views
3

我有這個類:如何在Rails中驗證虛擬屬性?

class Project < ActiveRecord::Base 

    validates :hourly_rate, :numericality => { :greater_than_or_equal_to => 0 }, 
          :allow_blank => true 

    def hourly_rate=(number) 
    self.hourly_rate_in_cents = number.present? ? number.to_d * 100 : nil 
    end 

end 

從本質上講,是被由用戶輸入的任何新hourly_rate將得到保存到數據庫中爲整數。

這對數字很適用。

但是所有正在輸入的string會自動轉換爲0.0,並且不需要任何驗證消息即可保存!

是不是有一種方法來驗證此使用任何Rails的驗證方法?

感謝您的任何幫助。

回答

1

如果您對此有一個讀者方法轉換的其他方式,它會像您期望的工作。你只在這裏顯示了賦值方法。

def hourly_rate 
    self.hourly_rate_in_cents and self.hourly_rate_in_cents.to_f/100 
end 

所有的驗證例程都是調用給定的方法並對結果應用測試。

你可能想確保存在專門測試:

validates :hourly_rate, :presence => true, ... 
2

您可以創建自己的validate方法,並用它來檢查對象的類型。

例如(和原諒我,如果有這個代碼中的錯誤,因爲它只是把我的頭頂部):

validate :hourly_rate_is_integer 

def hourly_rate_is_integer 
    errors.add(:hourly_rate, "must be Integer") unless self.hourly_rate.is_a?(Integer) 
end