Cache_sweeper undefined

Hola! A ver si alguien me puede ayudar con lo siguiente porque ando un
poco perdido:

He estado aprendiendo sobre caching siguiendo The Rails Way (capítulo
10) y probando a cachear fragmentos. Funciona muy bien pero no consigo
limpiarlos con cache_sweeper.

Tengo un modelo Plant al que quiero asociar un sweeper para que borre
los caches cuando se modifique, así que para ello tengo:

###################################################

app/models/plant_sweeper.rb

###################################################

class PlantSweeper < ActionController::Caching::Sweeper
observe Plant

def expired_cached_content(plant)
expire_fragment(:fragment => ‘families’)
expire_fragment(:fragment => ‘generes’)
end

alias_method :after_save, :expire_cached_content
alias_method :after_destroy, :expire_cached_content
end

###################################################

###################################################

app/controllers/plants_controller.rb

###################################################
class PlantsController < ApplicationController
cache_sweeper :plant_sweeper, :only => [:create, :update, :destroy]

(…)

end
###################################################

El problema es que cuando ahora voy a /plants, me dice que:

NoMethodError (undefined method `cache_sweeper’ for
PlantsController:Class)

He estado buscando pero no encuentro por qué el controlador no me
reconoce esto de “cache_sweeper”…

He visto también en el tutorial de Rails Envy [1] que los sweepers los
ponen en app/sweepers, pero creo que lo suyo ahora es colocarlos en
app/models.

Por otro lado, en CodeLevy [2] dicen que si solo quieres observar a
nivel de modelo para que se active el sweeper, no te hace falta
especificar nada a nivel de controlador y basta con colocar esto en
config/environment.rb:

config.active_record.observers = :plant_sweeper

Pero si hago eso, directamente la aplicación no arranca, con este mensaje:

#######################################

** Starting Rails with development environment…
Exiting
/usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:263:in
load_missing_constant': uninitialized constant ActionController::Caching::Sweeper (NameError) from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:453:in const_missing’
#######################################

¿Qué puede estar pasando? ¿Tendré mal instaladas las dependencias y
por eso da ese NameError?

Gracias!

[1] http://www.railsenvy.com/2007/2/28/rails-caching-tutorial#sweepers
[2]
http://codelevy.com/articles/2008/03/04/rails-caching-sweepers-controllers-and-models

On Jul 3, 2008, at 4:06 PM, Jaime I. wrote:

config.active_record.observers = :plant_sweeper

Mete esto en config/environments.rb

 # Load Sweepers from app/sweepers
 config.load_paths << "#{RAILS_ROOT}/app/sweepers"

2008/7/3 Francesc E. [email protected]:

On Jul 3, 2008, at 4:06 PM, Jaime I. wrote:

config.active_record.observers = :plant_sweeper

Mete esto en config/environments.rb

# Load Sweepers from app/sweepers
config.load_paths << "#{RAILS_ROOT}/app/sweepers"

Gracias, pero el sweeper lo tengo en app/models, no app/sweepers con
lo que eso no cambiaría nada, no?

Además el error es que no sabe lo que es
ActionController::Caching::Sweeper…

uninitialized constant ActionController::Caching::Sweeper (NameError)

On Jul 3, 2008, at 4:17 PM, Jaime I. wrote:

uninitialized constant ActionController::Caching::Sweeper (NameError)

Si no reconociera los sweepers daria un error tal como …

 NameError (uninitialized constant PlantSweeper)

El problema que tienes aqui es que la clase Sweeper no está
inicializada.

En Google hay gente que ha tenido el mismo problema que tu … [1]
Quizas hay algun plugin que hace algo feo … no se.

[1]
http://e-haitham.blogspot.com/2008/06/rails-order-of-requiring-libraries.html

2008/7/3 Jaime I. [email protected]:

config.load_paths << "#{RAILS_ROOT}/app/sweepers"

Gracias, pero el sweeper lo tengo en app/models, no app/sweepers con
lo que eso no cambiaría nada, no?

Para que no quede por probar, he cambiado el sweeper a app/sweepers y
lo he definido en load_paths pero da lo mismo, sigue dando el error de
antes.

En este blog [1] avisan de ponerlo en app/models, pero supongo que no
le funcionaba porque no lo metió en los paths… Obie F. dice
que lo pongamos en app/models…

[1]
http://ninajansen.dk/2008/05/14/cache-sweepers-in-rails-put-them-in-appmodels/

Yo actualizé una aplicación de Rails 2.0 a 2.1 y no tuve que tocar
nada de los Sweepers … no será algo de algun plugin que tengas por
allí?
Cuando sepas algo estaria de coña que lo comentaras en la lista …

2008/7/3 Francesc E. [email protected]:

En Google hay gente que ha tenido el mismo problema que tu … [1]
[1] http://e-haitham.blogspot.com/2008/06/rails-order-of-requiring-libraries.html

Gracias, Francesc, era eso lo que me pasaba por lo que se ve, igual
que a Haitham… Todo vuelve a funcionar si en config/environment.rb
lo hago
así:
require ‘active_record’
config.active_record.observers = :plant_sweeper

O sea, hago un require ‘active_record’ antes de definir el observer
para el sweeper. Raro raro…

Es una aplicación rails 2.0.2, he probado con una 2.1.0 y no hace
falta montarlo así. Pero si en mi aplicación 2.0.2 le digo que use la
gema 2.1.0, sigue petando, o sea que debe ser del orden de carga de
initializers, boot o algo… A ver si veo cómo dejarlo limpito porque
ese parche del require ahí no me gusta nada.

2008/7/4 Fernando G. [email protected]:

Es una aplicación rails 2.0.2, he probado con una 2.1.0 y no hace
falta montarlo as

Yo estoy con rails 2.0.2 y no he tenido que meter el:
config.active_record.observers

Tengo todo los sweepers declarados en el application.rb:

cache_sweeper :forums_forum_sweeper, :forums_category_sweeper,
:forums_topic_sweeper

Es una aplicación rails 2.0.2, he probado con una 2.1.0 y no hace
falta montarlo as

Yo estoy con rails 2.0.2 y no he tenido que meter el:
config.active_record.observers

:confused:

2008/7/4 Fernando G. [email protected]:

Yo estoy con rails 2.0.2 y no he tenido que meter el:
config.active_record.observers

Nada mejor que dormir a pierna suelta y volver a probar. Ya no falla y
no se por qué es… :slight_smile:

El caso es que ahora no tengo nada puesto de observers en
environment.rb, simplemente en PlantsController tengo mi cache_sweeper
:plant_sweeper, y funciona bien…

Perdonad por el mareo pero a veces veo bugs…

Por cierto, que en el listado que mandé al inicio del hilo había un
error, en el nombr del método expire_cached_content y no
expiredD_cache_content, vuelvo a poner los códigos tal y como me
estánfuncionando ahora.

Otra diferencia como veréis, ahora uso nombres globales para los
fragmentos.

###################################################

app/models/plant_sweeper.rb

###################################################

class PlantSweeper < ActionController::Caching::Sweeper
observe Plant

def expire_cached_content(plant)
expire_fragment(‘portada’)
expire_fragment(‘plant_show_ficha’)
expire_fragment(‘families’)
expire_fragment(‘generes’)
end

alias_method :after_save, :expire_cached_content
alias_method :after_destroy, :expire_cached_content
end

###################################################

###################################################

app/controllers/plants_controller.rb

###################################################
class PlantsController < ApplicationController
(…)
cache_sweeper :plant_sweeper, :only => [:create, :update, :destroy]
(…)
end
###################################################

Thankius!