我正在尝试验证用户在金额字段中输入的条目。
该字段为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的东西就不会被上述验证中的任何一个捕获
答案 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
}
您不需要使用此设置进行任何其他自定义验证。