2009-08-08 3 views
1

J'ai une action de contrôleur qui pourrait bénéficier de la mise en cache. Toutefois, lorsque j'active la mise en cache des actions via l'habituel:Est-il possible de faire fonctionner caches_action pour une méthode de contrôleur de rails accessible via HTTP POST?

caches_action :myaction, :expires_in=>15.minutes 

La mise en cache n'est pas appelée. Cela semble dû au fait que l'action est appelée à l'aide d'un HTTP POST. Pour les actions similaires invoquées à l'aide de HTTP GET, la mise en cache fonctionne correctement.

Je réalise que l'utilisation d'un POST pour cette action n'est probablement pas un grand style et brise les conventions de routage des ressources - sans doute c'est aussi pourquoi la réponse n'est pas mise en cache, même si elle pourrait l'être. Cependant pour l'instant je suis coincé avec lui car c'est ce que le client fait actuellement et je ne peux pas le changer facilement.

Alors, existe-t-il un moyen de forcer la mise en cache pour cette méthode même si elle est accessible via POST?

edit: Je devrais peut-être clarifier que le POST n'a pas d'effets secondaires, donc il est sûr de cacher l'action. Il aurait vraiment dû être un GET en premier lieu, il n'est tout simplement pas et ne peut pas être facilement changé pour le moment. De plus, cela n'a pas d'importance pour que les navigateurs ou les proxies ne mettent pas en cache la réponse.

Répondre

1

Le contenu des données de publication est-il identique à tous les articles? Je soupçonne qu'ils ne sont pas et c'est pourquoi l'action ne cache pas.

deux façons de traiter ceci:

1) Oubliez caches_action et utiliser Rails.cache facilement à l'intérieur de votre contrôleur pour mettre en cache les pièces coûteuses de votre code de contrôleur

2) Utiliser rack Middleware/Métal Endpoint pour recevoir les données post de l'autre application et chausse les données à la forme que vous voulez.

modifier:

Im Rails 2.3.3 et marchepieds je peux confirmer qu'il ne cache les requêtes POST

Aux fins de vérifier pendant que votre développement assurez-vous que vous avez défini perform_caching true dans le développement .rb:

config.action_controller.perform_caching    = true 

assurez-vous également que son même dans production.rb

J'ai testé ce scénario avec ce qui suit dans mon contrôleur:

caches_action :index 

def index 
    @listings = Listing.find(:all) 
end 

utilisant à la fois GET et POST requêtes ce cache comme prévu. i essayé également mettre les en-têtes HTTP Cache-Control: no-cache sur mon client de poste et l'action encore en cache

Si vous utilisez OSX utiliser cet outil génial http://ditchnet.org/httpclient/ pour créer requêtes GET et POST

+0

Les paramètres sont identiques - y a-t-il d'autres données avec le message (en-têtes?) qui pourraient le faire ne pas mettre en cache? Je ne les vois pas dans les journaux, mais le client peut-il définir des en-têtes pour contourner le cache? Je vais essayer la suggestion de Rails.cache. Pour rack/métal ai-je besoin de rails 2.3? Je suis sur 2.2.2 actuellement. – frankodwyer

+0

Voir les modifications ci-dessus pour vos commentaires. – ADAM

Questions connexes