属性设置器之前的validation可以键入cast
我有一个带有一个名为value的属性的对象,它是一个大十进制类型。 在类定义中,我有validates_numericality_of。
但是,如果我:
a.value = 'fire'
‘fire’最终在validation触发之前将类型转换为正确的类型,因此:
a.valid? => true
如何在类型转换之前进行validation?
谢谢
担
来自ActiveRecord :: Base docs :
有时您希望能够在不确定列确定的类型转换的情况下读取原始属性数据。 这可以通过使用所有属性具有的
访问器来完成。 例如,如果您的
_before_type_cast Account
模型具有余额属性,则可以调用account.balance_before_type_cast
或account.id_before_type_cast
。这在用户可能为整数字段提供字符串并且您希望在错误消息中显示原始字符串的validation情况下特别有用。 通常访问该属性会将字符串类型转换为0,这不是您想要的。
已创建一个新的gem来帮助validationrails中的类型 。
一个解释性的博客文章的存在是为了回答更多的“为什么”它首先创建。
使用此库,您的代码可以是:
class SomeObject < ActiveRecord::Base validates_type :value, :big_decimal end
除了将float之外的任何内容赋值给value
而不是将value
静默地转换为BigDecimal并保存它时,这将抛出exception。