属性设置器之前的验证可以键入cast

时间:2010-09-22 05:35:18

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

我有一个名为value的属性的对象,其类型为大十进制。在类定义中,我有validates_numericality_of。

但是如果我:

a.value = 'fire'

'fire'最终会在验证触发之前将类型转换为正确的类型:

a.valid? => true

如何在类型转换之前启动验证?

谢谢

2 个答案:

答案 0 :(得分:15)

来自ActiveRecord::Base docs

  

有时您希望能够阅读   没有的原始属性数据   列确定的类型转换运行它   当然先。这可以通过   使用<attribute>_before_type_cast   所有属性都具有的访问器。   例如,如果您的Account模型有   一个平衡属性,你可以打电话   account.balance_before_type_cast或   account.id_before_type_cast

     

这在特别有用   用户验证情况   可能为整数提供一个字符串   字段,你想显示   原始字符串返回错误   信息。访问该属性   通常会将字符串强制转换为   0,这不是你想要的。

答案 1 :(得分:1)

已经创建了一个新的gem来帮助validate types in rails

explanatory blog post存在以回答更多&#34;为什么&#34;它是在第一时间创建的。

使用此库,您的代码可能是:

class SomeObject < ActiveRecord::Base
  validates_type :value, :big_decimal
end

当除了float之外的任何内容都分配给value而不是将value静默地转换为BigDecimal并保存它时,这将抛出异常。