Rails Caching: использование свиперов для действий, требующих параметров - PullRequest
4 голосов
/ 25 января 2011

Я пытаюсь использовать подметальные машины для обновления страниц.Для обновления действий с индексами и т. Д. Все работает хорошо ... но я не могу подметать, чтобы интерпретировать параметры страницы.Если кто-нибудь может сказать мне, что не так с кодом ниже, я был бы очень признателен:

Контроллер:

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

# Это создает кэш, но не обновляет его (никогда).Если я помещаю команду expire_page непосредственно в действие (вместо уборщика), она отлично работает

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

Очиститель:

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

1 Ответ

1 голос
/ 28 сентября 2011

Если мы предположим, что вы скопировали и вставили код, то опечатка также присутствует в вашем коде.Поскольку вы не отметили ошибку с помощью Rails, мы можем предположить, что метлы не вызываются.(то есть after_update не вызывается).Я бы добавил несколько сообщений журнала, чтобы убедиться, что это действительно так.

Вопросы касаются Post:

  1. Является ли он потомком ActiveRecord :: Base?
  2. Есть ли у вас другие обратные вызовы, которые возвращают false и таким образом останавливают цепочку?

Примеры уборщиков в сети последовательно помещают строку cache_sweeper после caches_xxxлиний.Я был бы удивлен, если бы это имело значение, но это стоит проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...