验证不适用于Ranges?

时间:2017-03-30 10:19:43

标签: ruby-on-rails validation

有人可以向我解释为什么当我提交诸如" foo"之类的字符串时,我的验证不会被触发。到number

class Course < ActiveRecord::Base

  validates :number, :inclusion => 0..100

end

只有当我将代码更改为此...

class Course < ActiveRecord::Base

  validates :number, :inclusion  => 0..100, :numericality => true

end

......验证被触发。

这是一个Rails错误还是我错过了一些非常基本的东西?

我顺便使用Rails 4.2.0。

3 个答案:

答案 0 :(得分:1)

这是因为rails在进行验证之前将字符串转换为数字(假设您已将其保持为整数)。如果您在字符串上拨打to_i,则会获得0,这对您的范围有效。

例如:

> c = Course.new
> c.number = 'hi'
> c.number
=> 0
> c.valid?
=> true

我认为数字验证器在添加时会触发的原因是因为它会在任何类型转换发生之前检查该值:

> c.number = 'hi'
> c.number_before_type_cast
=> 'hi'

答案 1 :(得分:0)

请试试这个:

validates_numericality_of :number, :only_integer => true, 
 :greater_than_or_equal_to => 1,
 :less_than_or_equal_to => 99,
 :message => "can only be number between 1 and 100."

参考:http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_numericality_of

答案 2 :(得分:0)

这对我来说效果最好:

class Course < ActiveRecord::Base

    validates :number, :numericality => { :greater_than_or_equal_to => 0, :less_than_or_equal_to => 100 }

end