2011-01-20 20 views
1

私は単純なacts_asスタイルのモジュールを持っています。これはActiveRecord :: Baseに含まれています。メソッド内のアサーションを呼び出せません。助けて!

  1. が関連するインスタンスに欠落している方法を指示するのActiveRecordモデル

  2. インスタンスに不足しているメソッドを追加するhas_oneの関連付けを追加します。このモジュールの目的は、です。ここで

は、例えばモジュールである:

module TestModule 

    def self.included(base) 
    base.send :extend, ClassMethods 
    end 

    module ClassMethods 

    def test_me_out 
     has_one :text_page 
     send(:include, InstanceMethods) 
    end 

    end 

    module InstanceMethods 

    def method_missing(method, *args, &block) 
     Rails.logger.debug "#{method}" 
     #text_page.send(method, *args, &block) 
     text_page 
    end 

    end 
end 

そして、私はARモデルでそれを使用するかもしれない道...

Class Page < ActiveRecord::Base 
    test_me_out 
end 

問題があり、*のmethod_missing場合*メソッドが実行されると、すぐにmethod_missing内に "stack level too deep"エラーが発生します。

app/lib/test_module.rb:24:in `method_missing' 
    app/lib/test_module.rb:24:in `method_missing' 
    app/lib/test_module.rb:24:in `method_missing' 
    app/lib/test_module.rb:24:in `method_missing' 
    app/lib/test_module.rb:24:in `method_missing' 
    ... 

欠けている方法は 'id'ですか?あなたは関連クラス(text_page.send(method、* args、&ブロック))に欠落したメソッドを送るコード行をコメントアウトしたことに気付くでしょう。スタックレベルが深すぎます。

誰でもエラーを検出できますか?

PS。もちろん、これは実際のモジュールとユースケースの煮詰められた例ですが、これはエラーを示していますが、すばらしく失敗します。


SOLUTION

ビッグおかげ保存のためのアレックス。 ActiveRecord Idは、メソッド不足ブロックを使用して動的に生成されます。私の記憶が正しければ、ARは、例えば、クラスの属性のアクセサなどを定義するためにmethod_missingを使用しています -

def method_missing(method, *args, &block) 
    if method != :id && text_page.respond_to?(method) 
     text_page.send(method, *args, &block) 
    else 
     super 
    end 
end 

答えて

2

エリック:スーパーに伝承するために欠けているのid方法:次のコードは、それは聞かせて動作しますそれらはハードコーディングされていません。それらはインスタンス変数に格納されますが、.idと.id =メソッドはオンザフライで定義されています。結果として、関連するインターフェイスで参照したい欠けているメソッドを照合する方法を定義することをお勧めします。

+0

あなたはおそらく あれば使用することができtext_page.methods.include?(メソッド) text_page.send(メソッド、*引数、およびブロック) 他 スーパー(メソッド、*引数、およびブロック)アレックスねえ、私は誤解 – Alex

+0

終了あなたの提案を最初に読んでください。この要点の最下部を見てください:https://gist.github.com/787122。私は迅速なrespond_toをやる?メソッドを委譲する前に、関連するクラスにメソッドが存在することを確認してください。これはあなたが意味することですか? –

+0

私は重要なことは、method_missingブロック内の関連するモデルへの呼び出しが 'stack overflowing'であることです。 –

関連する問題