2010-01-01 3 views

Répondre

87

Si vous souhaitez mettre en cache une action, en fonction de tous les paramètres de la requête (ou dire sur presque tous), vous pouvez faire:

caches_action :my_action, :cache_path => Proc.new { |c| c.params } 

Ou, peut-être que vous voulez tous, mais certains params que vous utilisez juste pour Analytics (mais qui ont aucune incidence sur les dossiers dont vous récupérez):

caches_action :my_action, :cache_path => Proc.new { |c| c.params.delete_if { |k,v| k.starts_with?('utm_') } } 
+0

Dire l'action a le nom d'utilisateur john et que vous avez mises en cache quelques versions de ce en fonction des paramètres get aléatoires passés dans Y at-il un moyen d'invalider le cache pour l'action avec le nom d'utilisateur john ET toutes les versions en cache avec params? Exemple/john/image? Dimension = 50 et/john/image? Dimension = 100 est-il possible d'effacer toutes les versions de l'image de john? – Marc

+0

@Marc: Oui, voir la liste des idées http://code.google.com/p/memcached/wiki/NewProgrammingTricks#Namespacing – randomguy

+0

Espérons que cela aide quelqu'un: Dans Rails 3- lors de l'expiration d'un cache d'actions avec des paramètres personnalisés, un format défini, ET vous avez défini l'URL par défaut pour assurer une barre oblique, expire_action (: action =>: mon_action,: param_1 => "val",: format =>: json), rails n'utilise pas la bonne clé de cache. Au lieu d'effacer la clé de cache /my_action.json/?param_1=val, elle effacera /my_action.json/?param_1=val.json en raison de la façon dont elle déduit l'extension. https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_controller/caching/actions.rb#L179 – jkelley

3

Dans ce cas, vous devez utiliser des fragments de mise en cache:

dans votre contrôleur:

cache(params[:max_price], :expires_in => 10.minute) do 
    # get the result 
end 
10

Pour utiliser l'URL de requête comme la clé de cache que je fais quelque chose comme ceci:

caches_action :index, :cache_path => Proc.new {|c| c.request.url } 
Questions connexes