有人可以向我解释为什么当我提交诸如" 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。
答案 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