如何在Rails中验证虚拟属性?

时间:2013-05-15 19:34:00

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我有这堂课:

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

感谢您的帮助。

2 个答案:

答案 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, ...