涉及数值的验证错误

时间:2014-04-06 13:39:32

标签: ruby-on-rails validation rspec

我第一次使用验证,并且我尝试验证amount_spent和no_of_purchases字段,以便它只接受整数而不是字符串。所以200有效,但是有200个'不会。但是,当我尝试进行此测试时,字符串部分会失败,但我不确定为什么。这是我的rspec测试文件的片段:

it 'requires a # of purchases' do
  customer = Customer.new(valid_customer.merge(no_of_purchases: ''))
  customer_2 = Customer.new(valid_customer.merge(no_of_purchases: 0))
  customer_3 = Customer.new(valid_customer.merge(no_of_purchases: 'twenty'))
  expect(customer).to_not be_valid
  expect(customer.errors[:no_of_purchases]).to include "can't be blank"
  expect(customer_2).to be_valid
  expect(customer_3).to_not be_valid
  expect(customer_3.errors[:no_of_purchases]).to include "is not a number"
end

it 'requires an amount spent' do
  customer = Customer.new(valid_customer.merge(amount_spent: ''))
  customer_2 = Customer.new(valid_customer.merge(no_of_purchases: 0))
  customer_3 = Customer.new(valid_customer.merge(no_of_purchases: 'twenty'))
  expect(customer).to_not be_valid
  expect(customer.errors[:amount_spent]).to include "can't be blank"
  expect(customer_2).to be_valid
  expect(customer_3).to_not be_valid
  expect(customer_3.errors[:no_of_purchases]).to include "is not a number"
end

这是我的模型文件:

 validates_presence_of :first_name
 validates_presence_of :last_name
 validates_presence_of :email
 validates_presence_of :no_of_purchases, numericality: true
 validates_presence_of :amount_spent, numericality: true

我没有看到错误。我指定的数字是真的,所以它不应该验证字符串。唯一可能是问题的是我在模式文件中放置了默认值0。我很确定这是问题,因为当我使用binding.pry时,客户3有no_of_purchase,amount_spent为0而不是' 20'。

问题1:为什么会那样做? 问题2:我该如何解决?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

乍一看,我可以看到您错误地使用validates_presence_of。我不确定您使用的是哪个版本的Rails,但以下答案将与Rails 3和4相关。

让我们关注这两行:

validates_presence_of :no_of_purchases, numericality: true
validates_presence_of :amount_spent, numericality: true

显式validates_something_of验证一次只执行一次验证检查。对于validates_presence_of,您要求Rails检查此属性是否存在,而不是其他任何内容。追加numericality: true只会传入被忽略的选项哈希值。这就是您的数字检查在您的示例代码中无效的原因。

为了实现这一点,我们可以使用内置的validates方法将数值验证器应用于上述两个属性:

validates :no_or_purchases, :amount_spent, numericality: true

请注意,我没有添加明确的状态验证。这默认内置于数值检查中(因为nil不是数字!)。

希望这会有所帮助。此外,Rails validation's documentation解释了如何执行此操作,以及许多其他内置验证。