Rails caching: Utilisation balayeuses pour des actions qui nécessitent des paramètres

StackOverflow https://stackoverflow.com/questions/4794482

  •  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
Était-ce utile?

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:

  1. Est-ce une personne décédée de ActiveRecord :: Base?
  2. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top