属性设置器之前的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_castaccount.id_before_type_cast

这在用户可能为整数字段提供字符串并且您希望在错误消息中显示原始字符串的validation情况下特别有用。 通常访问该属性会将字符串类型转换为0,这不是您想要的。

已创建一个新的gem来帮助validationrails中的类型 。

一个解释性的博客文章的存在是为了回答更多的“为什么”它首先创建。

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

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

除了将float之外的任何内容赋值给value而不是将value静默地转换为BigDecimal并保存它时,这将抛出exception。