1

定義済みを使用するWriterクラスのインスタンスメソッドがありますか?演算子を使用して、posted_postsが定義されているかどうかを確認します。

def performance_score
  logger.debug posted_posts
  logger.debug defined?(posted_posts)
  unless defined?(posted_posts)
    ...
  else
    ...
  end
end

私のコントローラーには、次のように定義されたライターインスタンスがあります。

@writers = Writer.select("writers.*, p.total_posts, p.posted_posts").joins(...)

@ writers.performance_scoreを呼び出すと、最初のlogger.debug行から4つのposted_postsがあると表示されますが、2番目の行はnilを出力します。さらに、elseではなくunlessセクションに入ります。

これをテストするために、posted_postsを4にスタブアウトします。これにより、最初のlogger.debug行から4が出力され、2番目のlogger.debugはメソッドとして定義されていることを示します。さらに、それは他に行きます。

Railsアプリケーションでこれが失敗する理由を理解するのを手伝ってもらえますか?

4

2 に答える 2

2

ARELselectステートメントから返されるリレーションは、method_missing魔法を使用して呼び出しから値を返すため、実際には失敗する可能性があります。これはであるのと同じことではありませんdefined。テストオブジェクトの「メソッド」をモック/スタブするとdefine_method、定義された関数を作成している関数を使用している可能性があります。

これは代わりにあなたが望むことをするかもしれません。

if respond_to?(:posted_posts)
  ...
else
  ...
end
于 2012-12-06T23:49:32.597 に答える
0

AR abjectをクエリした後は、同じ変数名を使用しないでください。

@results = @writers.select("writers.*, p.total_posts, p.posted_posts")

@results.performance_score次に、コントローラーを呼び出します

于 2012-12-07T01:34:48.977 に答える