2013-05-15 93 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