哪个优先:Rails类型转换或验证?

时间:2017-11-15 02:24:04

标签: ruby-on-rails ruby validation activerecord

我对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_minute12

根据this article by ThoughtBot

"这是因为Active Record会自动键入所有输入以使其与数据库架构匹配。根据类型的不同,这可能非常简单,也可能非常复杂。"

难道不能创建对象吗?类型转换是否优先于我的验证?或者我的验证有问题吗?我很欣赏任何有关这方面的见解,因为我无法确定这里发生了什么。我还为此创建了一个模型规范,我仍然能够使用数字字符串创建一个新对象。

感谢您对此有任何见解。我仍在学习Rails的魔力。

1 个答案:

答案 0 :(得分:1)

来自它所说的rails docs

  

如果将:only_integer设置为true,则它将使用

     

/ \ A [+ - ]?\ d + \ Z /

它(only_integer验证器)的作用是它验证值的格式是否与上面的正则表达式匹配,以及一个仅包含' 12'等数字的字符串值。是一个匹配(返回一个真值为0并通过验证)。

2.3.1 :001 > '12' =~ /\A[+-]?\d+\z/
 => 0