Rails验证需要数字,即使状态未设置为true


68

我正在尝试保存没有一个字段集的记录-该记录在模型中具有有效的数值。尽管验证中不需要存在,但仍会引发错误,表明该字段不是数字。

验证:

validates :network_id,    :numericality => true

保存模型的代码:

networks.each do |network|
  network.url = network.raw_data.link
  network.save!
end

错误:

Validation failed: Network is not a number

Answers:


130
validates :network_id, :numericality => true, :allow_nil => true

@Unixmonkey是否需要数据库中允许空值的每个字段?还是有一种方法可以让Rails自动处理此问题(设置设置状态或allow_nil似乎有些痛苦)
Hopstream 2011年

@Hopstream如果要验证数字,则nil不是数字值。您必须明确允许它。您无需对所有字段都执行此操作。
Unixmonkey

Okey但如果我不想要零值怎么办?如果您想保存数字怎么办?
ExiRe 2012年

@ExiRe:如果只想要数字,则validates :network_id, :numericality => true。如果您尝试使用nil值保存,这将引发验证错误。
Unixmonkey,2012年

42
    validates :network_id, :numericality => {:allow_blank => true}

3
我认为这是正确的编写方式,然后+1
2011年

这是更有用的答案
Sandeep Garg 2014年

这确实更好,因为它允许使用空字符串:edgeguides.rubyonrails.org/…–
Hopstream

使用此验证,如果您提交非数字值,则验证通过,但该值设置为空,这不是您想要的值
Christer Fernstrom

@ChristerFernstrom我认为您的说法不正确。至少这是我在这里进行的测试:github.com/pmatsinopoulos/test_numericality请参见用户模型上的测试。他们在我的尽头路过绿色。
p.matsinopoulos

16

你应该用 allow_blank

validates :network_id,    :numericality => true, :allow_blank => true

哦,天哪-我以为默认为零。我应该将其添加到允许为零的所有字段中吗?在Rails上似乎有点多余。
Hopstream

1
@apneadiving我可能是错的……应该是`validates:network_id,:numericality => {:allow_blank => true}`,不是吗?
p.matsinopoulos,2011年

@Hopstream:看看我的链接::allow_blank选项类似于:allow_nil选项
2011年

1
@Hopstream:由于numericality检查需要它
2011年

1
您为文档发布的链接已损坏
Carlos Martinez

11

在Rails 4(Ruby 2)中,您可以编写:

validates :network_id, numericality: { greater_than_or_equal_to: 0, allow_nil: true }

2
我不知道为什么这对我不起作用。我正在使用Rails 4.2。通过该验证,我可以使用nil值保存,但也可以保存字符串。
leandrotk

0

您也可以这样写...

validates_numericality_of :network_id, allow_nil: true
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.