验证Ruby中具有大写字母的数字字段

时间:2015-09-12 16:44:02

标签: ruby-on-rails ruby validation numbers money-rails

我正在尝试验证用户在金额字段中输入的条目。

该字段为amount_money

此字段是在表单提交

上验证的字符串
 monetize :amount, :as => :amount_money
 validates :amount, numericality: {only_integer: true}
 validates :amount_money, numericality: {greater_than_or_equal_to: 0}
 validate :amount_money_within_limit
 validate :is_a_valid_number

我想确保没有字母或符号,且金额在可接受的范围内。

执行此操作的代码是

def amount_money_within_limit
    if amount_money && amount_money.cents > 10_000_00 
        errors.add(:amount_money, 'cannot exceed $10,000.')
    end
    if amount_money && amount_money.cents < 1_00 
      errors.add(:amount_money, 'Problem with Amount')
    end
end

这适用于输入数字,数字和字母,字母,特殊字符,但

如果我尝试鲍勃 - 验证开始了 但如果我尝试BBob - 验证被绕过。

如果输入包含2个大写字母彼此相邻 - 则失败。 我尝试了一个小写 - 但这并不适合,因为该领域货币化(金钱宝石) - 如果有有效输入,则小写会搞砸。

如果字段的输入包含两个大写字母 - 所有验证都被绕过,那么类似AA的东西就不会被上述验证中的任何一个捕获

2 个答案:

答案 0 :(得分:1)

为什么不使用正则表达式?像这样:

def is_a_valid_number? amount_money
  amount_money =~ /\d+/
end

答案 1 :(得分:1)

您似乎已在错误的字段上放置了1个验证,您应该仅在amount字段(您的真实数据库字段)上放置验证,而不是在amount_money上进行自动验证来自rails-money gem的字段。我将their documentation应用于您的案例的数字验证:

monetize :amount,
  :numericality => {
    :only_integer => true,
    :greater_than_or_equal_to => 1_00,
    :less_than_or_equal_to => 10_000_00
  }

您不需要使用此设置进行任何其他自定义验证。