4

ActiveRecord の検証で がどのように機能するかを調べるために ActiveRecord のソースを調べてきましたが、ソース内:if => proc_or_method_nameの唯一のインスタンスは:if、機能を呼び出す方法を説明するコメントにあります。

たとえば、モデルに次のような行を含めることができます。

validates_presence_of :name, :if => :nameable?

nameable?メソッドが指定されたモデルに対して真の値を返す場合にのみ、検証がチェックされます。

(Rails2)ソースのどこにもこの動作が見つからないため、この機能は実際にどこで定義されていますか?

4

2 に答える 2

3

この:ifオプションはファイルでチェックされていますactivesupport\lib\active_support\callbacks.rb

このメソッドshould_run_callbackは、コールバックを実行する必要があるかどうかを確認するために呼び出されます。

run_callbacks同じファイル内のメソッドから始めて、コールバックチェーンがどのように処理されるかも見てください。

そのファイルのv2.3.8からのいくつかのコードは次のとおりです。

def should_run_callback?(*args)
  [options[:if]].flatten.compact.all? { |a| evaluate_method(a, *args) } &&
  ![options[:unless]].flatten.compact.any? { |a| evaluate_method(a, *args) }
end

そして、これが私が見つけた方法です(誰かが興味を持っている場合に備えて):

  1. Railsv2.3.8をgithubからダウンロードして解凍しました。
  2. すべての.rb:ifファイルでgrepp'ed
  3. に、次activerecord/CHANGELOGのようなコメントがあり
    ます。ブロックまたはメソッドポインタを使用して検証を実行するかどうかを決定できるすべての検証に:ifオプションを追加しました。#1324 [Duane Johnson/jhosteny]。
  4. グーグルはそのコメントを求めた。グーグルキャッシュでそれを見つけました。
  5. コメント/追加が05/21/0510:57:18にdavidによって行われたことがわかりました
  6. 546ページのrailsgithub履歴に日付2005-05-21があります:
  7. :if作品がどのように機能するかについての知識を得ました
  8. commitが参照するコードがv2.3.8に存在しなくなったことがわかりました。そのコードの最新の場所を見つける必要がありました
  9. もう一度grepp:ifして、「良い」と感じた各ファイルを調べました。に来たactivesupport/lib/active_support/callbacks.rb
  10. ファイルで検索し:ifましたが、メソッド内の1つの場所でのみ見つかりましたshould_run_callback
  11. 投稿された回答
  12. 指を交差させ、賞金を待ちました。:D

それは楽しかった!

于 2011-01-05T16:38:32.577 に答える
3

Rails 3 の時点で、ActiveRecord コールバックはactive_record/callbacks.rbで定義されていますが、ActiveRecord モデルは ActiveModel を継承しているため、active_model/callbacks.rbファイルも確認する必要があります。

コールバック機能自体は別のコンポーネントです。実際、フィルターの前後の ActionController は実際にはコールバックです。このため、コールバック システムはActiveSupport::Callbacksで定義されたモジュールです。

これら 3 つの部分をまとめてマージすると、ActiveRecord コールバック機能が得られます。

于 2010-12-22T12:32:46.877 に答える