2012-02-24 37 views
0

我寫了一個gravatar幫手在我的學習應用程序中使用。用戶#索引動作列出所有用戶使用他們的gravatars,即使分頁也需要一段時間。有沒有辦法在Rails 3.2中緩存gravatars,請注意以下幾點:如何在Rails 3.2中緩存gravatars?

  1. 沒有使用具有緩存功能的Gravatar插件。
  2. 沒有緩存用戶頁面本身;實際上,我只是想要自己緩存圖片,而不必再次從gravatar.com抓取圖片。

    def gravatar_for(user, options = { size: 50 }) 
        gravatar_id = Digest::MD5::hexdigest(user.email.downcase) 
        size = options[:size] 
        gravatar_url = "http://gravatar.com/avatar/#{gravatar_id}.png?s=#{size}" 
        image_tag(gravatar_url, alt: user.name) 
    end 
    

回答

1

緩存整個用戶頁面或片段緩存圖像URL無論如何不會有所作爲,因爲圖像仍然會從Gravatar下載。 Gravatar將他們的Cache-Control標題設置爲5分鐘的最大年齡,並且您可以做的其他事情也不多。

一種可能性是將圖像保存到您可以控制響應標頭的另一個位置。

在開發過程中你可以做的一件小事就是不要在你的頁面上使用硬刷新。在某些瀏覽器CMD/CTRL + R或按下刷新按鈕時會發送帶有Cache-Control:max-age=0的請求標題,導致您重新下載所有圖像。您只需再次訪問該頁面即可進行軟刷新(例如:按下地址欄中的url按鈕),並且不會發送該標題。

2

我的問題是,爲什麼你需要這個?您正在從外部服務器和用戶瀏覽器放置圖像,並且gravatar.com必須緩存它。這就是爲什麼gravatar存在的原因,用於在沒有開發人員的任何工作的情況下管理頭像。如果你需要緩存gravatars,那麼爲什麼你真的需要它?

+0

當我點擊用戶索引頁面時,它看起來真的很難看到一個接一個地按順序加載gravatars。我認爲它會立即緩存它們,因爲它們瞬間顯示出來。 – Mohamad 2012-02-25 10:30:12

+0

即使你從你自己的服務器那裏服務,它也不會更快。另外,一些新的網頁瀏覽器只有在無法節省帶寬時才顯示圖像。 – Hauleth 2012-02-25 10:35:03

2

如果您查看源代碼,您會看到SO沒有執行自己的gravatar緩存。刷新頁面幾次,您可能會看到gravatars仍然是要加載的最後一個元素。

有些事情可以做,以提高性能爲:

  • 當在生產模式與正確設置高速緩存控制運行,瀏覽器會做一些圖像的緩存爲你(也許觀看了railscasts,插曲321我認爲)
  • 包括在你的img標籤的圖像尺寸,瀏覽器甚至是圖像之前將保留的屏幕空間適量是可用的,它確實減少重畫,感覺活潑
  • ,而不是即成您自己的佔位符更昂貴的identicons等