2016-02-12 62 views
0

如何過期模型中的主頁片段?Rails 4 Fragment Cache整個頁面。如何在模型中過期緩存

在我的HTML

<% cache 'main-page' do %> 
    # html here 
<% end %> 

在我的崗位型號

after_create :clear_cache 
after_update :clear_cache 

def clear_cache 
    ActionController::Base.new.expire_fragment('main-page') 
end 

這不清除緩存。如果我創建或更新帖子,緩存不會清除。如果我在rails控制檯中運行ActionController::Base.new.expire_fragment('main-page'),它將返回'nil'。如果我在後期模型中運行Rails.cache.clear而不是ActionController::Base.new.expire_fragment('main-page'),則可以運行。

回答

1

我相信你的問題是消化,因此,如果你改變你的緩存,這樣它應該工作:

<% cache 'main-page', skip_digest: true do %> 
    # html here 
<% end %> 

如果你想使用這種風格,其中緩存不會過期,依賴在檢測模型更改無效,你可能要考慮使用觀測或掃地,這是從軌道4,5刪除,但是很有用這個模式:

https://github.com/rails/rails-observers

不是答案您正在尋找˚F或者可能是另一種方式:

根據Post模型中的max updated_at生成緩存鍵。

每當任何帖子發生變化時,緩存鍵將自動錯過,並檢索最新帖子以重新緩存視圖的該部分。

module HomeHelper 
    def cache_key_for_posts 
    count   = Post.count 
    max_updated_at = Post.maximum(:updated_at).try(:utc).try(:to_s, :number) 
    "posts/all-#{count}-#{max_updated_at}" 
    end 
end 

然後在您的視圖:

<% cache cache_key_for_posts, skip_digest: true do %> 
    # html here 
<% end %> 
+0

好,據我所知,你的第二個選項是「正確的方式」。我明白了,但第一種選擇要簡單得多。 –

+0

第二個選項乾淨地將視圖緩存從模型中分離出來,但它也會觸擊數據庫來生成該密鑰,所以存在權衡。它與俄羅斯娃娃緩存的Rails 4緩存風格更加一致,但是,嘿,這是你的應用。如果您要做選項1,您可以考慮使用觀察者或清掃器https://github.com/rails/rails-observers將該代碼保留在模型之外。 –

+0

編輯我的答案,包括一些 - –