Domanda

Sto cercando di utilizzare spazzatrici al trattamento dei miei aggiornamenti di pagina. Per rinfrescanti azioni dell'indice, ecc tutto funziona bene ... ma io non riesco a spazzatrici per interpretare parametri della pagina. Se qualcuno mi può dire cosa c'è di sbagliato con il codice qui sotto, sarei molto riconoscente:

Controller:

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

# Questo crea cache, ma non si aggiorna esso (mai). Se metto il comando expire_page direttamente in azione (al posto della spazzatrice), funziona benissimo

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 spazzatrice:

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
È stato utile?

Soluzione

Se assumiamo si copia e incollato il codice, poi l'errore di battitura è anche nel codice. Dal momento che non ha ottenuto contrassegnato con un errore da Rails, possiamo quindi supporre che le spazzatrici non vengono chiamati. (Cioè l'after_update non viene chiamato). Vorrei aggiungere alcuni messaggi logger per verificare che questo è davvero il caso.

Domande è circa del messaggio:

  1. Si tratta di un defunto di ActiveRecord :: Base?
  2. Avete altri callback che stanno tornando falso e in modo da fermare la catena?

Gli esempi di spazzatrici in rete costantemente messo la linea cache_sweeper dopo le linee caches_xxx. Sarei sorpreso se questo fa la differenza, ma la sua pena di verificare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top