Hi, Why is cache_sweeper not a documented method? I was pretty sure it used to be, but I could be wrong. I can''t seem to find any information on it anymore in the online docs. As a side note, looking at the code for cache_sweeper it appears to only work with the :only option, not :except (ignores it)... what''s the reason for this? Thanks, Andrew --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---
Ok, the only documentation that exists for cache_sweeper seems to be at http://api.rubyonrails.com/classes/ActionController/Caching/Sweeping.html In addition to my comment about why cache_sweeper only accepts :only, I found that the sweeper doesn''t even appear to pay attention to anything I pass to :only. If I do... cache_sweeper :my_sweeper, :only => :test and call the :update action for example and the observed class in my_sweeper is modified, the sweeper is still run.... even though I told it to only use the observer for the :test action with :only => :test Does anybody else see something similar in their code? If what I said above makes no sense, what I''m saying is if you use :only, replace any or all actions you specify in there with anything and the observer will still get called. :only => :somerandomjunk I''m using rails 2.0.2 btw On 3/6/08, Andrew Kaspick <akaspick@gmail.com> wrote:> Hi, > > Why is cache_sweeper not a documented method? I was pretty sure it > used to be, but I could be wrong. I can''t seem to find any > information on it anymore in the online docs. > > As a side note, looking at the code for cache_sweeper it appears to > only work with the :only option, not :except (ignores it)... what''s > the reason for this? > > Thanks, > > Andrew >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---
I ran into this the other day and it took me a while to figure out
what was going on. This is the paragraph in the Rails book (page 460):
"If a request comes in that invokes one of the actions that the
sweeper is filtering, the sweeper is activated.
If any of the Active Record observer methods fires, the page and
action expiry methods will be called.
If the Active Record observer gets invoked, but the current action is
not selected as a cache sweeper, the expire class in the sweeper are
ignored. Otherwise, expiry takes place"
I had something similiar. I had a method called upload() in my
photo_controller that I renamed to create(), but forgot to change the
cache_sweeper:
cache_sweeper :photo_sweeper, :only => [:upload]
My sweeper looked like this:
class PhotoSweeper < ActionController::Caching::Sweeper
observe Photo
def after_create(record)
return if record.thumbnail?
expire_fragment(%r{photo\/latest})
end
end
This obviously made some caches not expire correctly. However, the
sweeper was still called, because one tells it to observe photos.
However, none of the calls to read_fragment or expire_fragment will
work. You can call them--they just return nil and do nothing.
Unlike the before/after/around_filters, the options :only and :except
don''t dictate whether the callbacks (after_create and others) in the
sweeper are called or not. The options dictate whether the cache
expiry functions work while in the sweeper or not.
It seems that the sweepers observe according to their Observable
behavior--they''re essentially active record observers, so they will
fire any time the AR class they''re observing has a callback. The
sweeper options :only, and :except don''t filter out calls, but only
that the cache expiry functions work.
I too found this a bit unintuitive, given how the
before/after/around_filters work. Does anyone else think/feel the
same?
On Fri, Mar 7, 2008 at 12:06 AM, Andrew Kaspick <akaspick@gmail.com>
wrote:>
> Ok, the only documentation that exists for cache_sweeper seems to be
> at
http://api.rubyonrails.com/classes/ActionController/Caching/Sweeping.html
>
> In addition to my comment about why cache_sweeper only accepts :only,
> I found that the sweeper doesn''t even appear to pay attention to
> anything I pass to :only.
>
> If I do...
> cache_sweeper :my_sweeper, :only => :test
>
> and call the :update action for example and the observed class in
> my_sweeper is modified, the sweeper is still run.... even though I
> told it to only use the observer for the :test action with :only =>
> :test
>
> Does anybody else see something similar in their code?
>
> If what I said above makes no sense, what I''m saying is if you
use
> :only, replace any or all actions you specify in there with anything
> and the observer will still get called. :only => :somerandomjunk
>
> I''m using rails 2.0.2 btw
>
> On 3/6/08, Andrew Kaspick <akaspick@gmail.com> wrote:
> > Hi,
> >
> > Why is cache_sweeper not a documented method? I was pretty sure it
> > used to be, but I could be wrong. I can''t seem to find any
> > information on it anymore in the online docs.
> >
> > As a side note, looking at the code for cache_sweeper it appears to
> > only work with the :only option, not :except (ignores it)...
what''s
> > the reason for this?
> >
> > Thanks,
> >
> > Andrew
> >
>
> >
>
--
http://webjazz.blogspot.com
http://www.mobtropolis.com
http://www.3cglabs.com
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Core" group.
To post to this group, send email to rubyonrails-core@googlegroups.com
To unsubscribe from this group, send email to
rubyonrails-core-unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---
Wow, so that''s what it''s doing. This explains the other "issue" I was experiencing and that is with one of my other sweeper callbacks being called that I specified from an entirely different controller (due to the Observer being active at all times). As the current "documentation" is right now, I''d sure say the way this method works is unintuitive. cache_sweeper actually does a number of other things that I was only able to extract from looking at it''s code. It allows (before|after)_controllername_action type methods to be used as well, but the only place I''ve seen this documented is the CHANGELOG from ages ago. :) Thanks for the comment Will. On 3/7/08, Wil Chung <iamwil@gmail.com> wrote:> > I ran into this the other day and it took me a while to figure out > what was going on. This is the paragraph in the Rails book (page 460): > > "If a request comes in that invokes one of the actions that the > sweeper is filtering, the sweeper is activated. > > If any of the Active Record observer methods fires, the page and > action expiry methods will be called. > > If the Active Record observer gets invoked, but the current action is > not selected as a cache sweeper, the expire class in the sweeper are > ignored. Otherwise, expiry takes place" > > I had something similiar. I had a method called upload() in my > photo_controller that I renamed to create(), but forgot to change the > cache_sweeper: > > cache_sweeper :photo_sweeper, :only => [:upload] > > My sweeper looked like this: > > class PhotoSweeper < ActionController::Caching::Sweeper > observe Photo > > def after_create(record) > return if record.thumbnail? > expire_fragment(%r{photo\/latest}) > end > end > > This obviously made some caches not expire correctly. However, the > sweeper was still called, because one tells it to observe photos. > However, none of the calls to read_fragment or expire_fragment will > work. You can call them--they just return nil and do nothing. > > Unlike the before/after/around_filters, the options :only and :except > don''t dictate whether the callbacks (after_create and others) in the > sweeper are called or not. The options dictate whether the cache > expiry functions work while in the sweeper or not. > > It seems that the sweepers observe according to their Observable > behavior--they''re essentially active record observers, so they will > fire any time the AR class they''re observing has a callback. The > sweeper options :only, and :except don''t filter out calls, but only > that the cache expiry functions work. > > I too found this a bit unintuitive, given how the > before/after/around_filters work. Does anyone else think/feel the > same? > > > On Fri, Mar 7, 2008 at 12:06 AM, Andrew Kaspick <akaspick@gmail.com> wrote: > > > > Ok, the only documentation that exists for cache_sweeper seems to be > > at http://api.rubyonrails.com/classes/ActionController/Caching/Sweeping.html > > > > In addition to my comment about why cache_sweeper only accepts :only, > > I found that the sweeper doesn''t even appear to pay attention to > > anything I pass to :only. > > > > If I do... > > cache_sweeper :my_sweeper, :only => :test > > > > and call the :update action for example and the observed class in > > my_sweeper is modified, the sweeper is still run.... even though I > > told it to only use the observer for the :test action with :only => > > :test > > > > Does anybody else see something similar in their code? > > > > If what I said above makes no sense, what I''m saying is if you use > > :only, replace any or all actions you specify in there with anything > > and the observer will still get called. :only => :somerandomjunk > > > > I''m using rails 2.0.2 btw > > > > On 3/6/08, Andrew Kaspick <akaspick@gmail.com> wrote: > > > Hi, > > > > > > Why is cache_sweeper not a documented method? I was pretty sure it > > > used to be, but I could be wrong. I can''t seem to find any > > > information on it anymore in the online docs. > > > > > > As a side note, looking at the code for cache_sweeper it appears to > > > only work with the :only option, not :except (ignores it)... what''s > > > the reason for this? > > > > > > Thanks, > > > > > > Andrew > > > > > > > > > > > > > > > -- > http://webjazz.blogspot.com > http://www.mobtropolis.com > http://www.3cglabs.com > > > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---