2017-02-17 9 views
0

Railsでの以下の2つの検証条件は同じですか?それとも、そうではありませんか?Railsでの異なる検証条件

if: :new_record? 
on: :create 
+0

好奇心の外に、なぜあなたは尋ねているのですか?同じではないように思われるインスタンスに気づいたことはありますか? – Iceman

+0

ええ、私は同じことが不思議でした。そして、あなたはそれらが実質的に話すことと同等か、文字通り同じ(またはほぼ同じ)コードパスに従っているのでしょうか? –

答えて

1

等価です。 on: :createは、最終的に(バックグラウンドで)if: :new_recordに最終的に変換されるDSLバージョンです。

validateに私たちをリードrails source code

を検証(参照の検証/ validates.rbの#L123)validates_with(参照の検証/ with.rb番号のL92)に私たちをリードし(参照validations.rb#から

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 

これはif: :new_record?

と同等です default_validation_contextに私たちをリード:私たちは onifなり見ることができますL162)
+1

申し訳ありませんが、これは私の最初の答えです。ここが複雑な場合、私に知らせてください。私はそれをもっと明確にしようとします。また、2つ以上のリンクを追加することはできませんでしたが、リンクされたレールのソースコードに行く場合は、言及したファイルに移動して、私が言及したコードを見つけることができます。 – lastgabs