0

データベースに保存されているリソースの詳細を表示するビューがあります。一部の詳細はリソース モデル自体に属し、一部の詳細は関連モデルに属します。

ビューでは、詳細にフラグメント キャッシングを使用します。

ユーザーがビューのボタンを押すと、ビューの一部がフォームに置き換えられるため、ユーザーは新しいページをロードせずに詳細を編集できます。フォームを開いた時点でキャッシュの有効期限が切れています(実際に確認しました)。ユーザーがフォーム ( ) を送信するusing :remote => trueと、フォームは非表示になり、jQuery を使用して元のコンテンツがリロードされ、部分的にレンダリングされます。

これまでのところ、すべてがうまく機能しています。<% cache ... do %>と内のコードから、元のコンテンツが新しい値で正しく再読み込みされます<% end %>

奇妙なことに、ページをリロードすると、新しい値の一部が消えてしまいます。代わりに、いくつかの古い値が表示されます (最後の送信後にキャッシュされているはずの値)。さらに奇妙なのは、間違った値と同じ新しいキャッシュ ファイルにある場合でも、一部の値が更新されることです。

私が見る限り、関連付けられたモデルの値は正しく、リソース モデルの値は間違っています (古い)。SQLキャッシュと関係があるのではないかと思っていましたが、ページをリロードするときにSQLキャッシュを空にする必要があると思うので、そうではないと思います。

フォームを開いて再度送信すると、データが更新され、すべて問題ありません。つまり、最後の送信からのデータがキャッシュに入っています。送信前にフォームのデータを変更しても、キャッシュ ファイルに含まれるのは最後の送信のデータのままです。そのため、他のフィールドが正しく更新されていても、Resource モデル用に送信されたデータが 1 回送信されるのが遅れているようです。

development.rb でキャッシュをオフにすると、すべてが期待どおりに機能します。すべてのデータは毎回更新されます。

ちなみに、私のサーバーにも同じ問題があります。

手がかりを持っている人はいますか?

4

2 に答える 2

0

Not sure if this will help, but in the last couple of days I have implemented a cache-key based fragment cache scheme on my own site with some success.

I implemented a get_cache_key function in all my models

  def get_cache_key(prefix=nil)
    cache_key = []
    cache_key << prefix if prefix
    cache_key << self

    child_objects.in_sort_order.each do |child_object|
      cache_key << child_object.get_cache_key
    end

    return cache_key.flatten
  end 

In my views I then used

<% cache(@home_page.get_cache_key('some_name_for_fragment')) do %>
...Render View
<% end %>

The models now produce a cache key that will invalidate the cache if parent model or any of its children are changed.

The full write up is here, on my website. Rails caching strategy using key-based approach

于 2013-01-22T22:44:32.087 に答える
0

データが更新されてからすぐにキャッシュされるようです。これまでの私の解決策は、リソースが更新されてから 2 分未満の場合は、ビューのキャッシュを削除することです。少し後で誰かがページを更新するまで、フラグメントはキャッシュされません。ページが表示されるたびに、ページ上の各リソース (30 個のリソース) の更新時間を照会する必要があるため、これはあまり良い解決策ではありません。

于 2013-02-06T13:53:01.537 に答える