2010-12-11 25 views
52

在Rails 3中实现min max验证器的方式是什么?如何在Rails 3中实现min/max验证器?

我有一个模型,min_age和max_age属性。

年龄可以在0..100的范围内,但我想也验证交叉值,我的意思是最大比greather或等于最低

{:min_age => 0, :max_age => 0} => true 
{:min_age => 0, :max_age => 1} => true 
{:min_age => 1, :max_age => 0} => false # max < min 
{:min_age => 1, :max_age => 101} => false # out of 0..100 range 

回答

97

退房加载ActiveModel ::验证:: NumericalityValidator: RailsAPI NumericalityValidator

规格:

it { 
    subject.max_age = 10 
    subject.min_age = 20 
    subject.should be_invalid 
    subject.errors[:min_age].should include("must be less than or equal to #{subject.max_age}") 
} 

代码:

validates :min_age, numericality: { greater_than: 0, less_than_or_equal_to: :max_age } 

validates :max_age, numericality: { less_than_or_equal_to: 100 } 

我不知道你是否想要验证是否存在,但你只需将它作为验证的另一个密钥添加

validates :max_age, numericality: { less_than_or_equal_to: 100 }, presence: true 
+0

好,感谢这个例子! – Robert 2014-01-20 18:00:43

+0

注意 - 这在“创建”上工作得很好,但在“更新”上我得到了“堆栈级别太深”的错误 - 使用有效的输入 - 这是一个寻找野兽。没有线索验证器是原因,因为在循环之前错误没有引用代码行。 – JosephK 2016-02-02 12:59:06

27

您还可以使用inclusion...in,如:

validates :height, :inclusion => { :in => 1..3000, :message => "The height must be between 1 and 3000" } 
9
validates_numericality_of :min_age, greater_than: 0 
validates_numericality_of :max_age, less_than_or_equal_to: 100 
validates_numericality_of :max_age, greater_than: :min_age 

您还可以使用年龄,像这样:

validates_numericality_of :age, less_than_or_equal_to: 100, greater_than: 0 
+0

min_age 30,max_age 10,仍然会出现低谷,但它不应该 - 我在问题中的第三行代码。 – astropanic 2014-01-14 17:02:31

+0

我建议你使用单一的年龄输入,而不是最小和最大。解决的一个办法是强制max_age大于min_age。看我的编辑。我没有测试代码。无论如何,你需要有一些代码来确保最小年龄不超过最大年龄。 – EastsideDeveloper 2014-01-14 19:20:24

+0

我不能使用单个属性,因为它不是一个年龄,而是一个年龄段。我知道我需要一些代码来确保交叉价值,那是我的问题。 – astropanic 2014-01-15 12:14:15