我有一个模型,通过正则表达式验证小数精度:
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验证本身或其他东西暴露出来的?
答案 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