Rails caching: Utilisation balayeuses pour des actions qui nécessitent des paramètres
-
24-10-2019 - |
Question
Je suis en train d'utiliser balayeuses pour gérer ma page est actualisée. Pour les actions de l'indice rafraîchissant, etc tout fonctionne bien ... mais je ne peux pas sembler balayeuses pour interpréter les paramètres de la page. Si quelqu'un peut me dire ce qui ne va pas avec le code ci-dessous, je serais très reconnaissant:
Contrôleur:
class PostsController < ApplicationController
load_and_authorize_resource
cache_sweeper :post_sweeper, :only => [:create, :update, :destroy]
caches_page :index
caches_page :show
caches_action :edit, :new
# This refreshes cache correctly
def index
@posts = Post.all
end
# Ceci crée le cache, mais ne rafraîchit pas (jamais). Si je place la commande expire_page directement dans l'action (au lieu de la balayeuse), il fonctionne très bien
def update
@post = Post.find(params[:id])
respond_to do |format|
if @post.update_attributes(params[:post])
flash[:notice] = t(:post_updated)
format.html { redirect_to(@post) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @post.errors, :status => :unprocessable_entity }
end
end
end
La balayeuse:
class PostSweeper < ActionController::Caching::Sweeper
observe Post
def after_create(record)
expire_cache_for_index(record)
end
def after_update(record)
expire_cache_for_index(record)
expire_cache_for_post(record)
expire_cache_for_edit(record)
end
def after_destroy(record)
expire_cache_for_index(record)
expire_cache_for_post(record)
expire_cache_for_edit(record)
end
private
def expire_cache_for_index(record)
expire_page :controller => 'posts', :action => 'index'
end
def expire_cache_for_post(record)
expire_page :controller => 'posts', :action => 'show', :id => record.id
end
def expire_case_for_edit(record)
expire_action :controller => 'posts', :action => 'edit', :id => record.id
end
end
La solution
Si nous supposons que vous copiez et collé le code, alors la faute de frappe est également dans votre code. Puisque vous n'avez pas une erreur signalés par par Rails, on peut alors supposer que les balayeurs ne sont pas appelés. (À savoir le after_update est pas appelé). Je voudrais ajouter quelques messages de l'enregistreur pour vérifier que c'est vraiment le cas.
Questions est sur le message:
- Est-ce une personne décédée de ActiveRecord :: Base?
- Avez-vous d'autres callbacks qui reviennent faux et stoppant ainsi la chaîne?
Les exemples de balayeuse sur le net constamment mis la ligne cache_sweeper après les lignes de caches_xxx. Je serais surpris si cela fait une différence, mais la peine de vérifier.