Validations
在数据存入数据库存之前,有多个层面可以对数据做校验。包括客户端校验、Controller 级别的校验、Model 级别的校验和数据库本身做约束。它们各有利弊,在此不做讨论。
这里要讲的是 Model 级别的校验。
类方法
常用:
除上述方法外,还有:
以及:
attribute_method?
放在这里有点不太合适,它和校验没有多大关系。和 Attribute Methods 反而关系比较大。
经验:牢记 validate
发生在 save
之前,如果你喜欢用 before_save
之类的进行检验,记得加上 return false
或者改变习惯,用 validate :validate_method
类似写法进行校验。
9 个 Helper Methods
9 个校验方法,语法糖。 调用方式五(不需要属性,需要校验器;作用于某个具体对象,间接做校验)
由于它们封装 validates_with
而来,既可当做类方法进行调用。
又由于它们具体实现时继承于 EachValidator,又可以当做 validates
的参数使用。
validates_confirmation_of
会为要校验的属性生成对应的读、写方法(x_confirmation、 x_confirmation=)
如:校验 password,会生成 password_confirmation 读方法和 password_confirmation= 写方法。
实例方法
valid?
校验是否通过,只有一个判断规则:当前 record 对象的 errors 值是否为空 errors.empty?
所以自己写校验方法或者校验器的时候,请记得设置 errors 的值。
Rails 5 里
valid?
和invalid?
可加类似[:create, :update]
这样的参数进行多个上下文进行校验。
调用方式比较
validate
validates 和 validates!
validates_each
validates_with
validates_presence_of *
属性
不需要
需要
需要
不需要
需要
校验器
不需要
需要
不需要
需要
不需要
直接、间接
直接
间接
直接
间接
直接
Note: 为了降低理解难度 validates_each 用到的 BlockValidator 不算为校验器; validates_presence_of 代表着其它与之类似的方法。
上面说的都是类级别的校验,如果需要针对某个实例对象单独做额外的校验,可以使用实例方法 validates_with,参数和同名类方法一样。
使用 validate
之前版本可以在 before_save 等方法里,设置 record.errors.add :xxx
然后 return false
做校验,中断后续操作。
Rails 5 之后默认关掉了这个功能,即不会中断后续操作。推荐使用 validate :method_name
在 method_name
写对应校验代码。
最后更新于