2017-02-17 55 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