2009-09-27 3 views
3

J'ai une action de rails qui répond aux demandes dans divers formats, y compris les requêtes AJAX, par exemple:Comment caches_action peut-il être configuré pour fonctionner avec plusieurs formats?

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 

J'ai mis cette action à mettre en cache à l'aide Memcached en utilisant:

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

Ce modèle semble fonctionne bien pour la mise en cache du résultat HTML mais pas pour le résultat JS. La partie JS fonctionne toujours correctement lorsqu'elle ne provient pas du cache. Cependant, quand il y a un cache, la page ne se met pas à jour.

Ce qui pourrait causer ceci et quelle est la solution? Mise à jour: en y cherchant plus, il semble que les requêtes du cache obtiennent le type mime 'text/html' au lieu de 'text/javascript'. Cependant, je ne suis pas sûr de savoir comment résoudre ce problème - est-ce une bizarrerie de memcached? (Rails 2.3.2)

Répondre

0

Je pense que j'ai un problème similaire, j'ai expérimenté que si je déplace le bloc render: update dans un fichier rjs, la requête sera beaucoup plus rapide. Si je fais le rendu comme ça, le temps de réponse était d'environ 8 secondes, après avoir passé à un modèle de rjs, il était de 80 ms. Je ne sais pas vraiment beaucoup de choses sur memcached, mais pour moi, il semble qu'il est seulement capable de mettre en cache les vues, si vous avez des idées sur la mise en cache d'un contrôleur s'il vous plaît partager avec moi.

0

Il existe un issue dans les rails même en version de bord (3.0.1).

je pouvais contourner avec ceci:

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

similaires à la réponse de voldy mais en utilisant des méthodes non dépréciée.

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 
Questions connexes