對於JSON API,我使用fresh_when
,像這樣(簡化):如何在語言環境更改時過期使用條件GET緩存?
class BalancesController < ApplicationController
def mine
fresh_when(current_user.balance)
end
end
這適用的ETag(如果 - 無 - 匹配)和的updated_at(IF-Modified-Since的)就好了。
但是,我想使不同語言的緩存無效。簡化:
class BalancesController < ApplicationController
before_action :set_locale
def mine
fresh_when(current_user.balance)
end
private
def set_locale
@locale = locale_from_headers
end
end
locale_from_headers
是一個比較複雜的lib,但在這個例子就足以說頭"Accept-Language: nl"
或"Accept-Language: en"
將導致@locale
是要麼:nl
或:en
。
我想在etag和if-modified之後使用它。這樣fresh_when在請求不同的語言時不會返回緩存的響應。像這樣:
get /balances/mine, {}, { "Accept-Language" => "en" }
#=>響應200 OKget /balances/mine, {}, { "Accept-Language" => "en", "If-None-Match" => previous_response.headers["ETag"] }
#=>響應304不修改get /balances/mine, {}, { "Accept-Language" => "nl", "If-None-Match" => previous_response.headers["ETag"] }
#=>響應200 OKget /balances/mine, {}, { "Accept-Language" => "nl", "If-None-Match" => previous_response.headers["ETag"] }
#=>響應304不修改
因此,只有當語言環境與緩存版本匹配時,響應才被緩存並作爲304返回。
使用cache()
塊,在Rails中使用片段緩存,adding a locale is simple。 如何實現與fresh_when
方法相同?