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. 没有直接的方法来实现这一点,因为它不是每个 rails MVC 规则,并且无论如何它是不可行的(除非你改变 rails)

  2. 您处理范围从视图开始和结束的数据,那么为什么要反转并让控制器负责记录/使用它,让视图/帮助方法记录它

  3. 因此,您可以在控制器中启动它,您可能已经在控制器中引用了缓存,将其向前推进,让视图操作它,并且在视图/帮助器中您可以记录它,保留一个单独的日志存储模块/文件来处理这个问题,让助手包含它,从视图中调用它。

于 2012-10-16T21:17:32.833 回答
0

我找到了另一种出路,我希望/猜它是线程安全的,如果有人确认会很棒

# 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 回答