Forum: Ruby on Rails Fragment caching not expiring the correct fragment cache

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
059ed46172a087063ce26250e44c8627?d=identicon&s=25 Fernando Perez (fernando)
on 2008-11-16 23:09
Hi,

I have a Product model. My app creates a fragment cache for
mysite.com/products, which triggers the index action (my app is
RESTful). Only admins can edit products, therefore, when adding a new
product, the mysite.com/products should expire.

But I have a problem: my products administration controller is in
admin/products_controller.rb, and therefore stupid Rails expires
admin/products fragment which is not correct.

Here is part of my code:

1) In the view:
--
<%- cache(:controller => 'products', :action => 'index') do -%>
  <%- for product in @products -%>
...
--

2) In the admin/products_controller.rb:
--
cache_sweeper :product_sweeper, :only => [:create, :update, :destroy]
--

3) And my sweeper:
--
class ProductSweeper < ActionController::Caching::Sweeper
  observe Product

  def after_save(product)
    expire_cache(product)
  end

  def after_destroy(product)
    expire_cache(product)
  end

  def expire_cache(product)
    expire_fragment(:controller => 'products', :action => 'index')
  end
end
--


How to tell Rails to not be clever, and simply force him to expire
products fragment instead of admin/products?
059ed46172a087063ce26250e44c8627?d=identicon&s=25 Fernando Perez (fernando)
on 2008-11-16 23:18
Fernando Perez wrote:
> Hi,
>
> I have a Product model. My app creates a fragment cache for
> mysite.com/products, which triggers the index action (my app is
> RESTful). Only admins can edit products, therefore, when adding a new
> product, the mysite.com/products should expire.
>
> But I have a problem: my products administration controller is in
> admin/products_controller.rb, and therefore stupid Rails expires
> admin/products fragment which is not correct.
>
> Here is part of my code:
>
> 1) In the view:
> --
> <%- cache(:controller => 'products', :action => 'index') do -%>
>   <%- for product in @products -%>
> ...
> --
>
> 2) In the admin/products_controller.rb:
> --
> cache_sweeper :product_sweeper, :only => [:create, :update, :destroy]
> --
>
> 3) And my sweeper:
> --
> class ProductSweeper < ActionController::Caching::Sweeper
>   observe Product
>
>   def after_save(product)
>     expire_cache(product)
>   end
>
>   def after_destroy(product)
>     expire_cache(product)
>   end
>
>   def expire_cache(product)
>     expire_fragment(:controller => 'products', :action => 'index')
>   end
> end
> --
>
>
> How to tell Rails to not be clever, and simply force him to expire
> products fragment instead of admin/products?

Due to completely outdated information I have been reading on the
internet, one should replace:

:controller => 'products', :action => 'index'

by

products_url

Now caching and expiring works correctly.
This topic is locked and can not be replied to.