レールがbefore_filter
のようなフィルタを実装する方法に興味があります。レールはどのようにbefore_filterを実装していますか?
しかし、ソースコードを読んだ後、私はまだ混乱しています。
私は、レールのフレームワークがfilter_chain
を維持しており、ターゲットメソッドの前にフィルタを実行していることに気付きました。
しかし、私は重要なプロセスを理解していません。レールはどのようにメソッド呼び出しをキャプチャしますか?
例えば、私はクラスDog
を持っていて、メソッドバークにbefore_filter
を設定しています。
dog.bark
を呼び出すと、レールは何らかの方法でこの呼び出しを取得し、代わりにその変更されたメソッドを実行する必要があります。
しかし、ソースコードでこのようなコードは見つかりません。
誰でも私にそのアイデアを教えたり、コードがどこにあるのかを指摘できますか?あなたがbefore_filter
、または任意の同様のフィルタ(after_filter
、around_filter
と思う)を設定すると
ありがとうございました!しかし、まだ混乱。あなたは「最後に、CallbackChainが実行されると...」と言っていました。私の質問は、CallbackChainを実行する必要があることをレールがどのようにして知っているのでしょうか?言ってやるがいい、before_filter:クラスDogに食べさせる。それから私がdog.barkを呼び出すとき、まず食べるべきです。しかし、どのように最初の場所では、レールは私が電話したことを知っていますか:樹皮? – HanXu
答えを更新しました。 – deefour
かなり明確ですが、まだ少し混乱しています。あなたの例では、バークを手動で再定義しますが、レールはコードによって自動的に行います。私はこれらのコードがどこにあるのかわかりません。 @haraldによると、レールは事前に各アクションを修正しています。私はAbstractController :: Baseで 'attr_internal'に気付きました。マジックが起こっていますか? – HanXu