Кэширование рельсов: использование подметальных машин для действий, которые требуют параметров
-
24-10-2019 - |
Вопрос
Я пытаюсь использовать подметальные машины, чтобы обрабатывать обновления моей страницы. Для освежающих индексных действий и т. Д. Все работает нормально ... но я не могу, казалось бы, подметало для интерпретации параметров страницы. Если кто -то может сказать мне, что не так с кодом ниже, я был бы очень благодарным:
Контроллер:
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
Решение
Если мы предположим, что вы скопируете и вставьте код, то опечатка также находится в вашем коде. Поскольку вы не были отмечены ошибкой по Rails, мы можем предположить, что подметальные машины не вызываются. (т. Е. После_чатка не называется). Я бы добавил несколько сообщений регистрации, чтобы убедиться, что это действительно так.
Вопросы о сообщении:
- Это умерший Activerecord :: Base?
- У вас есть другие обратные вызовы, которые возвращают ложные и, таким образом, останавливают цепь?
Примеры подметальной машины в сети последовательно ставят линию cache_sweeper после Линии caches_xxx. Я был бы удивлен, если это изменит ситуацию, но это стоит проверить.