微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 如何在Rails中验证前从值中删除美元符号?

这是我在我的模型中使用的内容
before_validation :strip_dollar_sign

validates :amount_due,:format => { :with => /^\d+??(?:\.\d{0,2})?$/ },:numericality => {:greater_than => 0}

private

def strip_dollar_sign
  self.amount_due = self.amount_due.to_s.tr!('$,','').to_f
end

如果我在Rails控制台中手动运行strip_dollar_sign函数中的行,我得到了我想要的(即400美元最终为400.0)但是当我在我的应用程序中使用实际表单时,值总是最终为0.0.有人抓到我做错了吗?

解决方法

这里有三个问题:

>正如Stefan在his answer中指出的那样,你可能想删除你的tr!打电话,虽然它不会影响$的更换.
>您正在使用tr!,并且以不正确的方式使用其返回值. TR! (以及大多数Ruby的!方法变体)如果没有对原始字符串进行任何更改,则返回nil.由于nil.to_f为0.0,这就是你得到它的原因(或者可能没有,见下文).你应该改用tr.
> Rails会自动将赋值参数转换为与其关联的数据库列的正确类型,因此即使在验证之前,您的值也会转换为浮点数,并且“$400”.to_f为0.0,这就是您的回调所看到的内容.解决方案是覆盖amount_due =而不是使用回调:

def amount_due=(value)
  value = value.to_s.tr('$','').to_f
  write_attribute(:amount_due,value)
end

原文地址:https://www.jb51.cc/ruby/267320.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐