我想在我的视图中记录某些块的缓存未命中数。我将日志存储在控制器的 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,您可能需要修改该方法以采用可选参数。
我建议,
没有直接的方法来实现这一点,因为它不是每个 rails MVC 规则,并且无论如何它是不可行的(除非你改变 rails)
您处理范围从视图开始和结束的数据,那么为什么要反转并让控制器负责记录/使用它,让视图/帮助方法记录它
因此,您可以在控制器中启动它,您可能已经在控制器中引用了缓存,将其向前推进,让视图操作它,并且在视图/帮助器中您可以记录它,保留一个单独的日志存储模块/文件来处理这个问题,让助手包含它,从视图中调用它。
我找到了另一种出路,我希望/猜它是线程安全的,如果有人确认会很棒
# 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 %>