Garbalización de rieles: usando barredoras para acciones que requieren parámetros
-
24-10-2019 - |
Pregunta
Estoy tratando de usar barredoras para manejar las actualizaciones de mi página. Para acciones de índice refrescantes, etc. todo funciona bien ... pero parece que no puedo interpretar los parámetros de la página. Si alguien puede decirme qué hay de malo en el código a continuación, estaría muy agradecido:
Controlador:
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
# Esto crea caché, pero no lo refresca (nunca). Si coloco el comando expire_page directamente en la acción (en lugar del barrendero), funciona 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
El barrendero:
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
Solución
Si asumimos que copia y pegó el código, entonces el error tipográfico también está en su código. Como no fue marcado con un error de Rails, podemos suponer que no se llaman a los barredoras. (es decir, no se llama a After_Update). Agregaría algunos mensajes de registrador para verificar que ese sea realmente el caso.
Las preguntas son sobre la publicación:
- ¿Es un difunto de Activerecord :: Base?
- ¿Tiene otras devoluciones de llamada que regresan falsas y, por lo tanto, detienen la cadena?
Los ejemplos del barrendero en la red colocan constantemente la línea cache_sweeper después Las líneas Caches_XXX. Me sorprendería si eso marca la diferencia, pero vale la pena echarle un vistazo.