2009-09-27 18 views
3

我这是为了响应在各种格式,包括AJAX请求请求轨的动作,例如:caches_action如何配置为适用于多种格式?

def index 
    # do stuff 
    respond_to do |format| 
     format.html do 
     # index.html.erb 
     end 
     format.js do 
     render :update do |page| 
      page.replace_html 'userlist', :partial => "userlist", :object=>@users 
      page.hide('spinner') 
      page.show('pageresults') 
     end 
     end 
    end 
    end 

我已经将这个动作使用缓存memcached的使用:

caches_action :index, :expires_in=>1.hour, :cache_path => Proc.new { |c| "index/#{c.params[:page]}/#{c.request.format}" } 

这种模式似乎工作正常缓存HTML结果,但不是JS结果。当JS部分不是来自缓存时,它总是可以正常工作。但是,当存在缓存命中时,页面不会更新。

什么可能会导致这种情况,什么是修复?

更新:挖掘更多它看起来像来自缓存的请求得到MIME类型'文本/ HTML'而不是'文本/ JavaScript'。然而,我不知道如何解决这个问题 - 它是memcached的怪癖吗? (Rails 2.3.2)

回答

0

我想我有类似的问题,我经历过,如果我将render:update块移出到rjs文件中,请求会更快。如果我这样做渲染,响应时间约为8秒,移出rjs模板后,响应时间为80ms。我对memcached没有太多了解,但对我来说,似乎他只能缓存视图,如果您对缓存控制器有任何想法,请与我分享。

0

即使在边缘(3.0.1)版本中,在rails中也有issue

我可以用此变通办法:

caches_action :show, :cache_path => :show_cache_path.to_proc 

    private 

    def show_cache_path 
    if request.accepts[0].to_sym == :html 
     "#{request.host_with_port + request.request_uri}.html" 
    else 
     "#{request.host_with_port + request.request_uri}.js" 
    end 
    end 
2

到voldy的答案,但使用非不赞成的方法类似。

caches_action :show, 
       :cache_path => :post_cache_path.to_proc, 
       :expires_in => 1.hour 

protected 

def post_cache_path 
    if request.xhr? 
    "#{request.url}.js" 
    else 
    "#{request.url}.html" 
    end 
end