【发布时间】:2015-09-12 16:44:01
【问题描述】:
我正在尝试验证用户在金额字段中输入的内容。
字段是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
这对于输入数字、数字和字母、字母、特殊字符非常有效,但是
如果我尝试 Bob - 验证开始 但如果我尝试 BBob - 验证将被绕过。
如果输入包含 2 个彼此相邻的大写字母 - 它会失败。 我尝试了一个小写字母——但这不适合这个领域是货币化的(金钱宝石)——如果有有效的输入,小写字母就会出错。
如果该字段的输入包含两个大写字母 - 所有验证都被绕过 所以像 AA 这样的东西不会被上述验证所捕获
【问题讨论】:
-
看here
-
什么是
amount_money?它是如何定义的?它是如何分配的?您谈论尝试"Bob",但您可能是指一个字符串,而字符串没有cents方法。请添加更多相关代码。 -
请注意,1_00 与 1.00 不同。 1_00 = 100
-
Sam D 指出的验证方法不能解释为什么我使用的验证适用于字母和数字的混合以及字符 - 但如果有两个大写字母则不起作用。关于 1_00 是 100 - 关键是 DD (或任何其他非数字组合将小于“一个数字”
-
你使用这颗宝石github.com/RubyMoney/money-rails吗?
标签: ruby-on-rails ruby validation numbers money-rails