Rails中的以下两个验证条件是否相同?或者不是吗?
if: :new_record?
on: :create
答案 0 :(得分:1)
它们是等价的。 on: :create
只是一个DSL版本,然后最终(在后台)转换为if: :new_record
。
验证(参见validations / validates.rb#L123)引导我们validates_with
(参见验证/ with.rb#L92)将我们引向validate
(cf.validations.rb# L162)我们可以看到on
成为if
:
if options.key?(:on)
options = options.dup
options[:if] = Array(options[:if])
options[:if].unshift ->(o) {
!(Array(options[:on]) & Array(o.validation_context)).empty?
}
end
这导致我们default_validation_context等同于if: :new_record?
def default_validation_context
new_record? ? :create : :update
end