【问题标题】:Ruby on Rails - Validate a CostRuby on Rails - 验证成本
【发布时间】:2011-05-09 13:56:51
【问题描述】:

验证用户输入的成本/价格的最佳方法是什么,验证规则如下:

  • 允许的格式示例 .23、.2、1.23、0.25、5、6.3(小数点后最多两位数)
  • 最小值 0.01
  • 最大值9.99

【问题讨论】:

  • 如果用户输入 4.555 你想要什么行为?失败?还是修剪多余的 5 个?

标签: ruby-on-rails validation


【解决方案1】:

查看价格并验证格式

#rails 3    
validates :price, :format => { :with => /\A\d+(?:\.\d{0,2})?\z/ }, :numericality => {:greater_than => 0, :less_than => 10}

#rails 2
validates_numericality_of :price, :greater_than => 0, :less_than => 10    
validates_format_of :price, :with => /\A\d+(?:\.\d{0,2})?\z/

【讨论】:

  • 这很酷,在 rails3 中您可以同时验证原始字符串和数字。但是,我不太明白你为什么在这里使用 ?: 断言。肯定是?小数部分后处理“它是可选的”的事情?
  • 使用:greater_than => 0时要小心。例如,如果数据库字段是精度为 2 的小数,则验证仍将允许值 0.00001,该值将在表中保存为 0。
  • 确实,你不应该因为@Majiy的上述原因使用:greater_than => 0,而应该使用:greater_than_or_equal_to => 0.01
  • 我认为你们都错过了正则表达式也会捕获像 0.00001 这样的事实
  • 这很好用,返回nil 小数点后两位以上:/\A\d+(?:\.\d{0,2})?\z/
【解决方案2】:

您可以构建自定义验证。比方说,例如第二种情况:

validate :price_has_to_be_greater_than_minimum

def price_has_to_be_greater_than_minimum
  errors.add(:price, "price has to be greater than 0.01") if
  !price.blank? and price > 0.01
end

更多信息,在 Rails 指南中,here

【讨论】:

  • 当 Rails 为此提供了一个开箱即用的验证时,没有理由编写自定义验证:validates :price, :numericality => { :greater_than => 0.01, :allow_blank => true }。与第一次验证相同——您正在针对 Regexp 进行验证,Rails 已经使用 validates :price, :format => ... 提供了它
【解决方案3】:

对于客户端验证,您可以使用像 this one 这样的 jQuery 插件,它允许您为给定的输入定义不同的有效格式。

对于服务器端验证,根据此question/answer,也许您应该为price 使用decimal 列,您可以在其中定义precisionscale 的值,scale 解决后面的两位数小数点限制。

然后要验证数值、最小值和最大值,您可以使用下一个验证方法:

validates_numericality_of :price, :greater_than => 0, :less_than => 10

【讨论】:

  • SQLite 3 忽略精度和比例参数,因此这不会阻止用户输入 4.555
  • 你不应该使用:greater_than => 0,因为@Majiy提到的原因,而是使用:greater_than_or_equal_to => 0.01
猜你喜欢
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2016-08-04
  • 1970-01-01
相关资源
最近更新 更多