2 Stimmen

Rails 3 Caching: Wie verwende ich einen Sweeper mit Action und Fragment-Caching, um den Cache ablaufen zu lassen?

Ich arbeite an einer Seite, die ein Restaurantmenü anzeigt. Ich habe 2 Modelle: FoodMenu has_many :products und Product belongs_to :food_menu. Ich habe keine Controller für beide Modelle. Stattdessen verwende ich eine "pages_controller.rb", um jedes FoodMenu und seine Produkte mit einer "menus"-Aktion anzuzeigen:

def menus
 @food_menus = FoodMenu.includes(:products).all
end

Ich möchte Action Caching für die Menüseite (localhost:3000/menus) verwenden, was auch funktioniert, aber ich kann den Cache nicht dazu bringen, abzulaufen, wenn ich ein Produkt aktualisiere, erstelle oder zerstöre.

Am Anfang von "pages_controller.rb" habe ich:

caches_action :menus
cache_sweeper :pages_sweeper

Ich habe versucht, getrennte Sweeper für die Modelle Product und FoodMenu in app/sweepers mit dem Beispielcode hier zu erstellen: http://guides.rubyonrails.org/caching_with_rails.html#sweepers aber das hat nicht funktioniert. Dann las ich in einem SO-Eintrag, dass der Sweeper alle Modelle beobachten soll, die der Controller verwendet, also nahm ich an, dass das bedeutet, dass ich eine "pages_sweeper.rb" erstellen muss erstellen muss, die sowohl das Product- als auch das FoodMenu-Modell beobachtet und die Aktion "menus" ausführt. Auch das hat nicht funktioniert. Was mache ich falsch? Hier ist, was ich jetzt in "pages_sweeper.rb" habe:

class PagesSweeper < ActionController::Caching::Sweeper
 observe Product, FoodMenu 

 # If our sweeper detects that a Product was created call this
 def after_create(product)
  expire_cache_for(product)
 end

 # If our sweeper detects that a Product was updated call this
 def after_update(product)
  expire_cache_for(product)
 end

 # If our sweeper detects that a Product was deleted call this
 def after_destroy(product)
   expire_cache_for(product)
 end

 def after_create(food_menu)
  expire_cache_for(food_menu)
 end

 # If our sweeper detects that a FoodMenu was updated call this
 def after_update(food_menu)
   expire_cache_for(food_menu)
 end

 # If our sweeper detects that a FoodMenu was deleted call this
 def after_destroy(food_menu)
   expire_cache_for(food_menu)
 end

 private
 def expire_cache_for(product)
 # Expire the menus action now that we added a new product
 expire_action(:controller => 'pages', :action => 'menus')

 # Expire a fragment
 expire_fragment('all_available_products')
 end

 def expire_cache_for(food_menu)
 # Expire the menus page now that we added a new FoodMenu
 expire_action(:controller => 'pages', :action => 'menus')

 # Expire a fragment
 expire_fragment('all_available_food_menus')
 end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X