rails fresh_when / stale?用法

时间:2010-09-19 00:48:46

标签: ruby-on-rails caching memcached

在我的post_index操作中,我生成了不同类型的“@posts”,如..

def index
  case params[:listing_type]
    when "all"
      @posts = get_all_post_from_memcached
    when "most_popular"
      @posts = get_all_most_popular_from_memcached

      respond_to do |format|
        format.html
        format.js #for ajax reqeusts
        format.xml #for rss etc
      end
  end
end

##updated
def index
  case params[:listing_type]
    when "all"
      #the key here is teh same key I used for memcached   
      if stale?(:etag => 'all_posts_key')
        @posts = get_all_post_from_memcached
      else
        head :not_modified and return
      end
    when "most_popular"
      if stale?(:etag => 'most_popular_key')
        @posts = get_all_most_popular_from_memcached
      else
        head :notified and return
      end
      respond_to do |format|
        format.html
        format.js #for ajax reqeusts
        format.xml #for rss etc
      end
  end
end

根据我的理解fresh_when需要etag,如果不同类型的渲染没有区别(在我的情况下渲染因html或ajax而异),则可以使用它

stale?也会占用etag并围绕respond_to块。

在这种情况下,etag将根据不同的列表类型而有所不同。但似乎fresh_whenstale?可以在这里使用的方式没有太大的灵活性?

由于

更新。我稍微更改了原始块,现在得到双重渲染错误我做错了,应该“头:通知并返回”只返回标题而不是触摸respond_to块?

1 个答案:

答案 0 :(得分:0)

如果你有像show方法那样的特殊响应处理,那么使用陈旧?帮手。如果您没有像编辑方法中那样的特殊响应处理并使用默认渲染机制(即,您没有使用respond_to或自己调用渲染),那么请使用fresh_when。