我有这堂课:
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的验证方法验证这一点?
感谢您的帮助。
答案 0 :(得分:3)
您可以创建自己的验证方法,并使用它来检查对象的类型。
例如(并且如果此代码中存在错误,请原谅我,因为它只是我的头顶):
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
答案 1 :(得分:2)
如果你有一个读者方法可以转换另一种方式,它将按预期工作。你这里只展示了分配方法。
def hourly_rate
self.hourly_rate_in_cents and self.hourly_rate_in_cents.to_f / 100
end
所有验证例程都是调用给定的方法并将测试应用于结果。
您可能希望确保对状态进行专门测试:
validates :hourly_rate, :presence => true, ...