Rails中的不同验证条件

时间:2017-02-17 23:16:35

标签: ruby-on-rails validation

Rails中的以下两个验证条件是否相同?或者不是吗?

if: :new_record?
on: :create

1 个答案:

答案 0 :(得分:1)

它们是等价的。 on: :create只是一个DSL版本,然后最终(在后台)转换为if: :new_record

来自rails source code

验证(参见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