レストランのメニューを表示するページに取り組んでいます。私は 2 つのモデルを持っています: FoodMenu has_many :products と Product belongs_to :food_menu です。どちらのモデルのコントローラーも持っていません。代わりに、「pages_controller.rb」を使用して、各 FoodMenu とその製品を「menu」アクションで表示しています。
def menus
@food_menus = FoodMenu.includes(:products).all
end
メニュー ページ (localhost:3000/menus) でアクション キャッシュを使用したいのですが、これは機能していますが、製品を更新、作成、または破棄するときにキャッシュを期限切れにすることができません。
「pages_controller.rb」の上部には、次のものがあります。
caches_action :menus
cache_sweeper :pages_sweeper
http://guides.rubyonrails.org/caching_with_rails.html#sweepersのサンプル コードを使用して、 app/sweepers に Product モデルと FoodMenu モデルの個別のスイーパーを作成しようとしましたが、うまくいきませんでした。次に、コントローラーが使用するすべてのモデルをスイーパーが監視することになっている SO エントリを読み込んだので、Product モデルと FoodMenu モデルの両方を監視し、"メニュー」アクション。それもうまくいきませんでした。私は何を間違っていますか?「pages_sweeper.rb」で私が今持っているものは次のとおりです。
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