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