我有一个名为value的属性的对象,其类型为大十进制。在类定义中,我有validates_numericality_of。
但是如果我:
a.value = 'fire'
'fire'最终会在验证触发之前将类型转换为正确的类型:
a.valid? => true
如何在类型转换之前启动验证?
谢谢
丹
答案 0 :(得分:15)
有时您希望能够阅读 没有的原始属性数据 列确定的类型转换运行它 当然先。这可以通过 使用
<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并保存它时,这将抛出异常。