2

さまざまな状態になる可能性のある提出物があり、次のような呼び出しで状態を確認できるmethod_missingオーバーライドを作成しました。

submission.draft?
submission.published?

これは素晴らしく機能します。


また、あまり良くないかもしれないさまざまな理由で、Packletbelongs_toameetingおよびbelongs_tosubmissionというモデルがあります。しかし、私はそれを見つけて驚いた

packlet.submission.draft?

を返しますNoMethodError。一方、#draft?メソッドをにハードコーディングするSubmissionと、上記のメソッド呼び出しが機能します。


インスタンスがActiveRecordアソシエーションを介して定義されている場合でも、method_missingメソッドを認識させるにはどうすればよいですか?

4

1 に答える 1

2

ドラフトを追加しましたか?あなたのrespond_toへのメソッド?そのオブジェクトのメソッド?私の推測では、問題はそこで発生する可能性があります。入力するとどうなりますか:

submit.respond_to?(:draft?)

これを修正するには、実際にrespond_to?を記述します。このような方法:

def response_to?(method、include_priv = false)#:nodoc:
  ケースmethod.to_sym
  いつ:draft?、:published?
    true
  そうしないと
    super(method、include_priv)
  終わり
終わり

ただし、代わりにmethod_missingを使用せずにこれを実装することをお勧めします。そのため、次のようなメタプログラミングを実行します。

クラス提出
  [:draft、:published] .each do | status |
    define_method "#{status}?" 行う
      status == "#{status}?"
    終わり
  終わり
終わり
于 2011-02-05T19:35:41.943 に答える