在Exception上取消片段缓存

时间:2010-01-31 03:31:05

标签: ruby-on-rails

如果我像这样缓存rss响应:

<% cache do %>
  <%= fetch_rss(http://example.org) %>
<% end %>

如果rss没有正确返回,我怎么能阻止它缓存?即如果fetch_rss返回异常或返回'Not Found'

2 个答案:

答案 0 :(得分:0)

棘手。

一些想法。

您可以将fetch_rss调用拉入控制器。缓存实际上只是您的应用程序可用的哈希。所以这需要一些额外的工作,但可能是最直接的方法。显式检查缓存,如果缓存过时,则调用 fetch_rss 或从缓存中提取rss值并传入视图以正常渲染。

或者,您可能可以让您的fetch抛出错误,然后换行异常处理程序。如果有例外情况,您可以捕获并调用 expire_fragment

答案 1 :(得分:0)

fetch_rss方法移动到它所属的控制器中,然后处理已知的异常:

def index
  begin
    @rss = fetch_rss

    # Caching can be done here ...
  rescue InvalidRssError, NotFoundError => e
    # ...
  end
end

正如您所看到的,假设在获取RSS时没有异常,除非您获得成功,否则不需要过期或以其他方式更改缓存。