2009-09-27 3 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 부분은 캐시에서 오지 않을 때 항상 올바르게 작동합니다. 그러나 캐시 히트가있을 때 페이지는 업데이트되지 않습니다.

어떤 일이 발생할 수 있으며 수정 사항은 무엇입니까?

업데이트 : 더 자세히 살펴보면 캐시의 요청이 'text/javascript'대신 'text/html'MIME 유형을 얻는 것처럼 보입니다. 그러나 나는 이것을 고치는 방법을 모르겠다 - 그것은 memcached의 특질인가? (레일즈 2.3.2)

답변

0

제가 비슷한 문제가 있다고 생각합니다. 렌더 : rjs 파일로 업데이트 블록을 옮기면 요청이 훨씬 빨라질 것입니다. 이처럼 렌더링을하면 응답 시간은 약 8 초가되고 rjs 템플릿으로 이동하면 80ms가됩니다. memcached에 대해 많이 알지는 못하지만 컨트롤러에 대한 캐싱에 대한 의견이 있으면 나와 공유 할 수있는 유일한보기를 캐시 할 수있는 것 같습니다.

0

가장자리 (3.0.1) 버전에서도 레일에 issue이 있습니다.

나는이 그것을 해결 수 :

voldy의 대답하지만 비 사용되지 않는 방법을 사용하여 유사
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

.

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 
관련 문제