【问题标题】:Validating number field that has capital letters in Ruby验证Ruby中具有大写字母的数字字段
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • Ruby 不是我的母语 - 所以我在实现它时遇到了问题。我还需要它采用验证格式,因此如果 {validation check failed} 出现优雅的错误结束,然后在提交表单时调用它
  • 您可以使用任何语言的正则表达式。如果您是 Ruby 新手,那么您首先需要阅读 Rails 中的验证,如果这对您没有帮助,请使用 regexp。
【解决方案2】:

您似乎在错误的字段上放置了 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
  }

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

【讨论】:

    猜你喜欢
    • 2016-12-20
    • 2016-11-24
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多