我第一次使用验证,并且我尝试验证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:我该如何解决?
感谢您的帮助。
答案 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解释了如何执行此操作,以及许多其他内置验证。