私は単純なacts_asスタイルのモジュールを持っています。これはActiveRecord :: Baseに含まれています。メソッド内のアサーションを呼び出せません。助けて!
が関連するインスタンスに欠落している方法を指示するのActiveRecordモデル
インスタンスに不足しているメソッドを追加する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
あなたはおそらく あれば使用することができtext_page.methods.include?(メソッド) text_page.send(メソッド、*引数、およびブロック) 他 スーパー(メソッド、*引数、およびブロック)アレックスねえ、私は誤解 – Alex
終了あなたの提案を最初に読んでください。この要点の最下部を見てください:https://gist.github.com/787122。私は迅速なrespond_toをやる?メソッドを委譲する前に、関連するクラスにメソッドが存在することを確認してください。これはあなたが意味することですか? –
私は重要なことは、method_missingブロック内の関連するモデルへの呼び出しが 'stack overflowing'であることです。 –