我对Rails 4.2的预期行为非常好奇,但我无法找到问题的答案。
我在所有时间属性上为模型添加验证。我希望他们只接受整数,而不是数字字符串。我的模式中此属性的数据类型是整数。我有这样的验证:
RANGE = 0..59
validates :start_minute, inclusion: { in: RANGE }, numericality: true
我也尝试过这些其他验证。我得到了相同的结果。
validates_numericality_of :start_minute, inclusion: { 0..59, only_integer: true }
validates :start_minute, inclusion: { in: 0..59 }, numericality: { only_integer: true }
当我从请求规范中将我的参数传递给我的控制器时,start_minute
为"12"
。但是,当我查看创建的对象时,start_minute
为12
。
"这是因为Active Record会自动键入所有输入以使其与数据库架构匹配。根据类型的不同,这可能非常简单,也可能非常复杂。"
难道不能创建对象吗?类型转换是否优先于我的验证?或者我的验证有问题吗?我很欣赏任何有关这方面的见解,因为我无法确定这里发生了什么。我还为此创建了一个模型规范,我仍然能够使用数字字符串创建一个新对象。
感谢您对此有任何见解。我仍在学习Rails的魔力。
答案 0 :(得分:1)
来自它所说的rails docs,
如果将:only_integer设置为true,则它将使用
/ \ A [+ - ]?\ d + \ Z /
它(only_integer验证器)的作用是它验证值的格式是否与上面的正则表达式匹配,以及一个仅包含' 12'等数字的字符串值。是一个匹配(返回一个真值为0并通过验证)。
2.3.1 :001 > '12' =~ /\A[+-]?\d+\z/
=> 0