おはようございます、
少し背景が役立つかもしれません。出席追跡ソリューションとして使用する非常に単純なアプリを作成しています。これは、ジムで実行中のコンピューターに配置され、ユーザーは自分の名前を入力して、行ったトレーニングの種類に基づいてボタンをクリックできます。
アプリを実行している人々は過度に技術的ではありませんが、ホームページと「ヘルプ」ページの基本的なテキストを変更する方法を彼らに提供したかったのです。「ヘルプテキスト」「メインページテキスト」などの列を持つメタモデルを作成しました。これは、ActiveAdmin インターフェイスを介して更新できます。
ホーム ページとヘルプ ページの両方でページ キャッシングを行いたい (もっと複雑なプロジェクトで Rails キャッシングを学習するため)、Meta -> "help_text" 属性が変更された場合にのみ「ヘルプ」ページを期限切れにしたい。ただし、他の Meta -> 属性のいずれかが変更された場合、ホームページは期限切れになります。
これは可能ですか?
私のキャッシング コードは、現時点では非常に基本的なものです。
class MetaSweeper < ActionController::Caching::Sweeper
observe Meta
def after_create(meta)
expire_cache_for(meta)
puts "[CACHE] Expiring cached pages"
end
def after_update(meta)
expire_cache_for(meta)
puts "[CACHE] Expiring cached pages"
end
def after_destroy(meta)
expire_cache_for(meta)
puts "[CACHE] Expiring cached pages"
end
private
def expire_cache_for(meta)
expire_page(:controller => 'static_pages', :action => 'home')
expire_page(:controller => 'static_pages', :action => 'help')
# Expire a fragment
#expire_fragment('all_available_products')
end
end
そして、application_controller で:
cache_sweeper :meta_sweeper
ありがとう!
編集1
最初の回答から、「メタ」モデルに仮想属性を設定して、help_content 属性が変更されたかどうかをキャプチャしようとしました。これにより、/help ページを期限切れにする必要があるかどうかを判断できます。
meta.rb
attr_accessor :help_changed
before_update :set_cache_expiry_checker
private
def set_cache_expiry_checker
help_changed = "you bet its changed!"
end
meta_sweeper.rb
def after_update(meta)
puts "should be doing something here about expiring...."
if meta.help_changed
puts "should expire help page"
else
puts "should NOT expire help page"
end
アプリケーションを実行すると、最初のプットの出力が表示されますが、2 番目の出力は表示されません。meta.help_changed は nil のように見えます....モデルに仮想属性がありますが。after_update の先頭で「puts meta.inspect」を実行すると、仮想属性を除くすべてのメタ属性が表示されます。データベースのものだけをプルするスイーパーで何かが起こっていますか?
これを行うために変数を設定できるスイーパー内の別の場所はありますか? 私はやってみました:
expire_help_cache = meta.help_changed
meta_sweeper.rb の一番上にありますが、after_update メソッドの外にいる場合は「メタ」変数がないため、エラーがスローされます。