2017-02-17 50 views
0

Rails中的以下两个验证条件等效吗?或者他们不是?Rails中的不同验证条件

if: :new_record? 
on: :create 
+0

只是出于好奇,你为什么问,你有没有注意到他们似乎不一样的情况? – Iceman

+0

是的,我想知道同样的事情。你的意思是说他们在实际操作中是否相同,或者他们是否按照相同(或几乎相同)的代码路径行事? –

回答

1

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

rails source code

,用于验证(参见验证/ validates.rb#L123)引导我们,导致我们validate(参见validations.rb#validates_with(参见验证/ with.rb#L92) 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 
+1

对不起,这是我第一次在这里回答 - 如果它很复杂,让我知道,我会尽量让它更清晰。此外,我无法添加超过2个链接,但如果您转到链接源代码,只需导航到我提到的文件,以便找到我提到的代码。 – lastgabs