[英]Caching/Etag for Static Action in Rails 4
由於Rails 4刪除了頁面緩存和動作緩存,我想知道什么是Rails 4方式緩存一個沒有變量且在視圖中只有html的動作? 我應該在視圖中片段緩存靜態html嗎? 當沒有模型將其設置為過期時,如何設置etag / fresh_when? 我很難找到一個示例或約定來緩存什么應該是最容易緩存的頁面。
需要注意的是,雖然視圖完全是靜態的,但頁面仍然具有動態導航欄,具體取決於用戶是否已登錄。 你如何處理這樣的靜態頁面,而不采取行動緩存,因為它已被刪除,並且約定已設置為不使用gem版本?
例:
class HomesController < ApplicationController
def index
end
end
家/ index.html.erb
<div>A bunch of normal html tags with no erb</div>
編輯:基於@ severin的回答和我自己的研究,這是我到目前為止所提出的。
class HomesController < ApplicationController
def index
fresh_when(["some-identifier", current_user, flash])
end
end
此外,我正在使用https://github.com/n8/bust_rails_etags重置部署后的所有etags,因為視圖可能在部署之間發生了變化。 我認為這很好地涵蓋了etag,雖然我仍然很好奇是否會自動包含一些關於視圖的標識符以及是否需要“some-idnetifier”? 是否會出現問題,有時current_user和flash會為零?
現在關於片段緩存靜態內容的第二點。 我假設我做了:
cache "v1" do
all my html
end
我必須記住在頁面更改時始終更改緩存標識符,否則我的應用程序將提供過時的內容。 任何方式自動化這個或已經由rails處理? 只是緩存最后一次更新視圖或更聰明的東西會很好,所以我不必跟蹤我的靜態內容何時被更改。
您可以在沒有模型的情況下設置etag / last修改數據,請查看文檔: http : //api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when
所以你可以這樣做:
def index
fresh_when(:etag => 'some_made_up_etag', :last_modified => a_long_time.ago, :public => true)
render
end
注意:您不需要提供etag和最后一次修改時間戳,您只需提供一個etag或僅在時間戳上提供最后一次修改。
除此之外,我還將片段緩存整個視圖內容。
或者您可以使用官方插件/ gem繼續使用action- / page_caching: https : //github.com/rails/actionpack-page_caching
關於問題第二部分的一些補充:
Rails將RAILS_CACHE_ID環境變量的內容添加到其所有緩存鍵(示例中的etag和片段緩存鍵)。 bust_rails_etags gem添加了另一個僅影響etags的環境變量...因此,在您的情況下,您可以刪除bust_rails_etags gem並更新所有部署中的RAILS_CACHE_ID環境變量。
您甚至可以通過在config / environment.rb中添加類似的內容來自動更新RAILS_CACHE_ID環境變量:
code_revision = # ... some piece of code that gets the current revision.
# I'm using git and I use the following (crude) piece of
# to get the current revision:
# code_revision = `git log --pretty=format:%h -n1`.strip
ENV['RAILS_CACHE_ID'] = code_revision
這樣,當前代碼修訂版始終添加到所有緩存鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.