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

Dan*_*ipo 10 ruby ruby-on-rails ruby-on-rails-3

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

但是,如果我:

a.value = 'fire'
Run Code Online (Sandbox Code Playgroud)

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

a.valid? => true
Run Code Online (Sandbox Code Playgroud)

如何在类型转换之前获得验证?

谢谢

Mla*_*vić 15

来自ActiveRecord :: Base文档:

有时,您希望能够在不确定列确定的类型转换的情况下读取原始属性数据.这可以通过使用<attribute>_before_type_cast 所有属性具有的访问器来完成.例如,如果您的Account模型具有balance属性,则可以调用 account.balance_before_type_castaccount.id_before_type_cast.

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

  • 仅供参考,如果您想这样做而不会在您的视图中收到奇怪的验证消息。例如“&lt;attribute&gt; before type cast must be a number”你可以创建一个[custom validator](http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-validators)来检查`“#{attribute}_before_type_cast” ` 而不是仅仅检查属性本身。 (2认同)
  • @sheerun不,这不起作用,因为message选项不会更改与验证错误相关联的属性.(例如,在"<type>之前,类型转换必须是数字",您只能使用该选项来更改消息的"必须是数字"部分.) (2认同)