ビューで特定のブロックのキャッシュ ミスの数をログに記録したいと考えています。コントローラーの after_filter にログを保存します。
ビュー内でインスタンス変数を操作することはできないようです。ビューのレンダリング中に情報を保存し、コントローラーの after_filter で利用できるようにする最善の方法は何ですか?
ビューで特定のブロックのキャッシュ ミスの数をログに記録したいと考えています。コントローラーの after_filter にログを保存します。
ビュー内でインスタンス変数を操作することはできないようです。ビューのレンダリング中に情報を保存し、コントローラーの after_filter で利用できるようにする最善の方法は何ですか?
ロジックを専用のモデル オブジェクトに移動することを検討します。
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 %>
これが最善の解決策かどうかはわかりませんが、テスト レール アプリで動作します。
コントローラーにメソッドを追加します。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 以上インクリメントできるようにする場合は、オプションのパラメーターを取るようにメソッドを変更することができます。
私は提案します、
レールMVCルールごとではないため、これを達成する簡単な方法はありません。また、レールを変更しない限り、実行できません。
ビューから始まりビューで終わるスコープを持つデータを扱うので、なぜ逆に行ってコントローラにログ/利用の責任を負わせ、ビュー/ヘルパーメソッドにログを記録させるのですか
したがって、コントローラーで開始することができます。コントローラーでキャッシュを参照し、転送し、ビューに操作させ、ビュー/ヘルパーでログに記録し、モジュール/ファイルを保存する別のログを保持して、この問題を処理します。ヘルパーにそれを含めさせ、ビューから呼び出します。
私はもう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 %>