3

ウェブサイトでは Gravatar を使用していますが、 Stackexchange が行っているのと同様に、ユーザー エクスペリエンスを向上させるために、ユーザーがプロフィール画像を直接アップロードできるようにしたいと考えています。

当社のウェブサイトでは、ユーザーは相互にフォロー、コメント、「いいね」、およびコンテンツを直接的または間接的に生成する方法で対話することができます。これは、ユーザー アバターを含むキャッシュ フラグメントがあちこちに散らばっており、レンダリング パフォーマンスに悪影響を与えずにキャッシュ フラグメントを無効にする合理的な方法を見つけることができないことを意味します。

私たちが検討した可能な解決策は次のとおりです。

オプション 1) Gravatar アプローチを採用し、非常に短いExpires/Cache-Control max-ageヘッダーを設定して、同じ画像ファイル名をリサイクルします。

オプション 2) JavaScript によって読み取られ、サーバーに最新データのアバターを要求する 2 番目の Ajax 要求を作成するために使用されるユーザー ID を含むデータ属性を持つすべてのユーザーにプレースホルダー画像を使用します。

この問題を解決するより良い方法はありますか? 私たちは何かを見落としていますか?

4

1 に答える 1

0

私はあなたの質問を理解していると思いますが、解決策としてオプション 2 を理解しているかどうかはわかりません。これは、それが優れた解決策ではないことを示している可能性があります。私だったら、再利用されているユーザー gravatar を囲む html を、ユーザー ID をキーとする最上位のキャッシュ キーにキャッシュするだけです。IE

<% cache("user_#{user.id}_profile_image") do %>
  <img src="blahblahblah or gravatar helper code or whatev">
<% end %>

ユーザーが gravatar をアップロードし、その後デフォルトの gravatar 画像がキャッシュされることを懸念している場合、最善の選択肢は次のとおりです。

1) グラバターをアップロードするために送信するユーザー プロファイル領域に、そのユーザーのキャッシュ フラグメントを実際に無効にする更新アクションを指す更新リンクを用意します。すなわち

expire_fragment "user_#{user.id}_profile_image"

( http://guides.rubyonrails.org/caching_with_rails.html )

2) デフォルトの gravatar リダイレクトを使用して画像をアップロードする代わりに、クリックをインターセプトして独自のコントローラーに送信し、バックグラウンド タスクを 15 分ほどで実行するようにスケジュールしてから、リダイレクトする JavaScript 応答をレンダリングすることができます。実際の gravatar ページに移動して、写真をアップロードします。バックグラウンド ワーカーは、後で実行されたときにフラグメントをクリアします。これは、彼らが実際に画像をアップロードすることを前提としており、全体としてはひどい考えだと思います.

正直なところ、最初からグラバターをキャッシュすることを心配している理由がわかりません。gravatar サーバーにヒットしているため、サーバーに負荷がかかることはありません。自分で保存することは、gravatar を使用する点で少し自滅的なようです。うまくいけば、あなたの質問はより簡単になりました(そして、ユーザーが自分の画像をアップロードするときにデフォルトのキャッシュされたグラバター画像をクリアする方法)。これは#1で解決できます。これにより、キャッシュされたグラバター画像を期限切れにし、独自のものを使用して再キャッシュできますユーザーが画像をアップロードした後の画像。(次のようなロジックがあるため、次にページがレンダリングされたときに画像が再キャッシュされます。

<% cache("user_#{user.id}_profile_image") do %>
  <% if user.has_uploaded_image? %>
     <%= display_profile_image %>
  <% else %>
    <%= display_gravatar_image %>
  <% end %>
<% end %>
于 2013-09-29T00:33:22.487 に答える