I''m following railscasts tutorial on fragment caching, everything works great except for the sweepers. When i put expire_fragment(%r{.*}) directly in my controller, i can expire my fragments with wonderful ease. Yet when i write a nice little sweeper like this code block, nothing gets expired (the puts have been added in for troubleshooting): class PhraseSweeper < ActionController::Caching::Sweeper observe Phrase def after_update(phrase) expire_cache(phrase) end def expire_cache(phrase) puts "=====This Is Activated Via expire_cache(phrase) " puts expire_fragment(%r{.*}).class expire_fragment(%r{.*}) end end I put this put it in apps/sweepers, and initialize the folder under environment.rb. When i update my phrase model I get this in my console: =====This Is Activated Via expire_cache(phrase) NilClass =====This Is Activated Via expire_cache(phrase) NilClass Yet when i have the expire_fragment called via my controller i get this in the console: ======This is called via the controller=====Hash So, my sweeper folder is getting initialized, and the code is running on update, but for some reason the puts are called twice, and the expire_fragment doesn''t work at all. Rails 2.1.0 Ruby 1.8.6. Any suggestions?? -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Have you determined what %r{.*} evaluates to in the context of your Sweeper? -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Ar Chron wrote:> Have you determined what > > %r{.*} > > evaluates to in the context of your Sweeper?%r{.*} will delete absoloutly everything in my cache, i think i found my error after reading this forum thread http://www.ruby-forum.com/topic/145163#643061 . In my controller i had: phrase_sweeper :phrase_sweeper, :only => [:create, :update, :destroy] when i was actually using an action called :rank_up, for some reason i just assumed if i was updating a model, the :update action would cover it, although i wasn''t using :update in my controller. I''ve yet to try the changes, but i''ll let you know the outcome. The confusing part was that the sweeper gets called no mater what, but the expire_fragment only works on the specified actions. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Richard Schneeman wrote:> The confusing part was > that the sweeper gets called no mater what, but the expire_fragment only > works on the specified actions.I actually gave up on the sweepers in my app, as they were far too general, and expired more than was necessary in some cases, and given the filters and sorting that can be done, it''s all fragment caching. Now the models decide which of their own fragments to expire (via Rails.cache.delete) depending on what was changed. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
> Now the models decide which of their own fragments to expire (via > Rails.cache.delete) depending on what was changed.Sounds interesting do you have a code snippet or tutorial you can point me to, before i get too entrenched in this sweeper mess?? -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Basically, all my controllers inherit from GenericController, all my models from GenericModel, so I can single source stuff like these behaviors, but override if necessary... GenericController: def create model = params[:controller].singularize.downcase @object = params[:controller].singularize.camelcase.constantize.new(params[model]) if @object.save # expire caches invalidated by the creation of this object @object.expire_caches ''create'' end end def update model = params[:controller].singularize.downcase @object = params[:controller].singularize.camelcase.constantize.find(params[:id]) orig_name = @object.name if @object.update_attributes(params[model]) expire_type = (@object.name == orig_name ? ''update'' : ''rename'') # expire caches invalidated by just an update, or an update # including a name change @object.expire_caches expire_type end end Generic Model: # models have fragments in basically # modelname.id.row, # modelname.id.show, # modelname.id.related, and a bunch of other ''sub-fragments'' # that make up the ''related'' items navigation sidebar def expire_caches(method) model = self.class.table_name.singularize case method when ''update'' # just expire the ''show'' fragment for this model expire_base_fragment model, self.id when ''destroy'' # destroy all the fragments for this model, and all other # fragments that include this model - this is driven by # an attribute of each model, which tells what the related # models are destroy_caches model, self.id when ''rename'' # just like destroy destroy_caches model, self.id when ''create'' # this case looks at models related to the current # one to see if those caches should be invalidated. i.e., # creating this model as a child of another invalidates # that models "children" cache ... ugly code omitted... else # there are other actions that can cause different fragments # to be expired - relating 2 models will cause 4 fragments to # be expired: # this model''s list of that related type, # that model''s list of this related type, # and both model''s aggregate ''related'' fragment ... ugly code omitted... end end The various "expire" or "destroy" methods are all variants of: def expire_base_fragment(model, id) Rails.cache.delete(''views/''+model+''/''+id.to_s+''/show'') end -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---