3

我有这堂课:

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 的任何验证方法来验证这一点吗?

谢谢你的帮助。

4

2 回答 2

4

您可以创建自己的验证方法并使用它来检查对象的类型。

例如(如果这段代码有错误,请原谅我,因为它只是在我的脑海中):

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
于 2013-05-15T20:29:53.790 回答
2

如果您有一个可以转换另一种方式的阅读器方法,它将按您的预期工作。您仅在此处显示了分配方法。

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

所有的验证例程都是调用给定的方法并对结果应用测试。

您可能希望确保专门测试存在性:

validates :hourly_rate, :presence => true, ...
于 2013-05-15T19:45:26.383 回答