Rails - 小数点数的regexp验证

时间:2015-12-02 08:18:45

标签: ruby-on-rails ruby regex ruby-on-rails-4 ruby-on-rails-4.2

我有一个模型,通过正则表达式验证小数精度:

    class Loan < ActiveRecord::Base
      validates :amount,
                format: {with: /\A\d+(?:\.\d{0,2})?\z/}, numericality: {less_than: 1000000}, allow_blank: true
    end

在Rails 4.2.4

l = Loan.new
l.amount = 1.1111
l.valid? # false

在Rails 4.2.5

l = Loan.new
l.amount = 1.1111
l.valid? # true

我的正则表达式中有一个问题是由较新的版本或Rails,Rails验证本身或其他东西暴露出来的?

2 个答案:

答案 0 :(得分:1)

class Loan
  include ActiveModel::Model
  attr_accessor :amount
  validates :amount, format: {with: /\A\d+(?:\.\d{0,2})?\z/}, numericality: {less_than: 1000000}, allow_blank: true
 end

在Rails 4.2.5中:

l = Loan.new
l.amount = 1.1111
l.valid? # false

所以这必须来自其他地方。

如果您更改了Ruby的版本,那可能就是。

可能是Rails改变了它处理格式转换的方式(正则表达式对字符串起作用,因此给出一个数字必须在某处进行某些转换)。我对此表示怀疑(查看发行说明)。

答案 1 :(得分:0)

这可以通过自定义验证而不是正则表达式来实现吗? 类似的东西:

validates :amount, numericality: {less_than: 1000000}, allow_blank: true
validate :amount_has_ok_decimal_places

def amount_has_ok_decimal_places
  decimals = amount.to_s.split('.')
  if decimals.size == 2 && decimals.last.size > 2
    errors.add(:amount, "can't be more than 2 decimal places")
  end
end