2

ビューで特定のブロックのキャッシュ ミスの数をログに記録したいと考えています。コントローラーの after_filter にログを保存します。

ビュー内でインスタンス変数を操作することはできないようです。ビューのレンダリング中に情報を保存し、コントローラーの after_filter で利用できるようにする最善の方法は何ですか?

4

4 に答える 4

1

ロジックを専用のモデル オブジェクトに移動することを検討します。

class MyController > ApplicationController
  around_filter :record_cache_misses

  def record_cache_misses
    @cache_miss_logger = CacheMissLogger.new
    yield
    @cache_miss_logger.persist_count
  end
end

ビューでは、通常のメソッド呼び出しになります。

<% @cache_miss_logger.increment_count %>
于 2012-10-16T15:55:48.733 に答える
1

これが最善の解決策かどうかはわかりませんが、テスト レール アプリで動作します。

コントローラーにメソッドを追加します。send呼び出しに問題がない限り、公開する必要があります。

def increment_miss
  @miss_count ||= 0
  @miss_count += 1
end

次に after_filter (私は に制限しました:index):

after_filter :only => :index do
  Rails.logger.info("miss_count: #{@miss_count.to_i}")
end

次に、必要な回数だけビューでメソッドを呼び出します。

<% controller.increment_miss %>

increment_by呼び出しごとに 1 以上インクリメントできるようにする場合は、オプションのパラメーターを取るようにメソッドを変更することができます。

于 2012-10-16T16:13:24.067 に答える
0

私は提案します、

  1. レールMVCルールごとではないため、これを達成する簡単な方法はありません。また、レールを変更しない限り、実行できません。

  2. ビューから始まりビューで終わるスコープを持つデータを扱うので、なぜ逆に行ってコントローラにログ/利用の責任を負わせ、ビュー/ヘルパーメソッドにログを記録させるのですか

  3. したがって、コントローラーで開始することができます。コントローラーでキャッシュを参照し、転送し、ビューに操作させ、ビュー/ヘルパーでログに記録し、モジュール/ファイルを保存する別のログを保持して、この問題を処理します。ヘルパーにそれを含めさせ、ビューから呼び出します。

于 2012-10-16T21:17:32.833 に答える
0

私はもう1つの方法を見つけました。それがスレッドセーフであることを願っています/推測します。誰かが確認したら素晴らしいでしょう

# in controller
before_filter :foo
after_filter :bar

def foo
  class << @cache_miss
    attr_accessor :count
  end

  @cache_miss.count = 1
  puts "----------#{@cache_miss.count}" # => 1
end

def bar
  puts "----------#{@cache_miss.count}" # => 2
end

#in views
<% @cache_miss.count = 2 %>
于 2012-10-17T04:39:02.970 に答える