2

おはようございます、

少し背景が役立つかもしれません。出席追跡ソリューションとして使用する非常に単純なアプリを作成しています。これは、ジムで実行中のコンピューターに配置され、ユーザーは自分の名前を入力して、行ったトレーニングの種類に基づいてボタンをクリックできます。

アプリを実行している人々は過度に技術的ではありませんが、ホームページと「ヘルプ」ページの基本的なテキストを変更する方法を彼らに提供したかったのです。「ヘルプテキスト」「メインページテキスト」などの列を持つメタモデルを作成しました。これは、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 メソッドの外にいる場合は「メタ」変数がないため、エラーがスローされます。

4

1 に答える 1

2

Railsは、属性が変更されfoo_changed?たかどうかを通知するメソッドと、すべての変更を一覧表示するメソッドを提供します。スイーパーが呼び出されるまでに、これらはすでにリセットされていると思います。foochanges

before_updateただし、関心のある列がダーティであるかどうかをチェックするコールバックを追加することはできます。これに基づいてインスタンス変数を設定し、スイーパーでインスタンス変数の値を確認します。

于 2012-04-07T16:14:40.310 に答える