2017-02-17 2 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) приводит нас к validates_with (см валидаций/with.rb # L92), что приводит нас к validate (ср 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 
+1

Извините, это мой первый ответ, когда-либо здесь - если он запутан, дайте мне знать, и я постараюсь сделать его более ясным. Также я не мог добавить более двух ссылок, но если вы перейдете к исходному коду связанных релей, просто перейдите к файлам, которые я упомянул, чтобы вы могли найти код, о котором я упоминал. – lastgabs

Смежные вопросы